Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-03-2006, 18:29   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2002
Beiträge: 102
Mal zum Thema callstack ...

Moinsen,

beschäftige mich seit längerem (leider) mit dem (selber verbugten) Debugger und frage mich, was denn noch eine "gesunde" callstacklänge darstellt. Ich vermute mal die Begrenzung liegt bei 256 (wie bei den Rekursionsstufen), selber erreiche ich locker mal 30-40 Funktionen, die im Stack liegen, da bei mir oft eine Funktion eine andere aufruft (hat man schnell bei komplexerem Messaging, auch ein Broadcast erzeugt ein Stackobjekt!). Auch Rekursion ist kein Fremdwort und unumgänglich (?) da ich sehr viel mit Objektbäumen arbeiten muss. Programmiert wird in AS2 btw.

Ist das normal? Wie schauts bei euch denn so mit der Stacklänge aus, sagen wir mal wenn das Programm irgendwo "tief drinsteckt". Was sind Eure Strategien, um so was zu vermeiden?

Eine Idee die mir einfällt ist die Ausführung quasi zu "entkoppeln" indem eine Funktion mit einem winzigen setInterval ausgeführt wird, so dass sich der darunterliegende Stack entleeren kann. Funktioniert aber natürlich nicht immer.

Sonst noch Ideen? thx
frankiee ist offline   Mit Zitat antworten
Alt 27-03-2006, 18:52   #2 (permalink)
Neuer User
 
Benutzerbild von Xeef
 
Registriert seit: Sep 2004
Ort: Spain/Ibiza
Beiträge: 942
What ? um was gehts den hier ??

Zitat:
selber erreiche ich locker mal 30-40 Funktionen
also ich habe gerade ein etwas umfangreicheres project vor mir der
ca. 5000 zeilen hat

und ich komme insgasamt nicht auf 40 functionen !



was fur ein Stack ??

programirst du irgend ein CPU nach ?
__________________
Languages : (in the order of knowledge/preference)
Read: Flash AS, PHP, JS, Html, DHtml, Basic, C++, DOS, 3DMaxScript, English, Deutsch, Magyar, XML, Pascal, VB, Spanish
Write: Flash AS, Basic, PHP, JS, DHtml, Html, ..., C++, ...., ..., English, ..., ..., ..., ...., Deutsch, ..., Magyar

wen du mein deutsch nicht magst whele eine andere sparache von den obrigen ;)
Xeef ist offline   Mit Zitat antworten
Alt 27-03-2006, 19:03   #3 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
also 40 functionen / methoden sind ja nun eher nen witz die hab ich schon bei kleinerern sachen wie nen Mp3 player oder na ImageGallery weit übertroffen.
im allg. gilt es immer unnötige objecte zu deleten, und nur dann objecte dauerhaft im Speicher zu lassen wenn sie persistent über die gesamte anwendung sind, bzw. wenn man sie cachen will weil das neu initialisieren zu viel performance raubt.

Im allg. rechne ich mal bei einem durchschnitts 1 mann projekt mit etwa 80 Klassen mit durchschnittlich 5 methoden das wären dann mal schlappe 400 funktionen und ich hatte noch keinerlei probleme wegen dem speicher.

- erstelle zunächst das was du brauchst
- und lösche alles was du nicht brauchst

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 27-03-2006, 19:13   #4 (permalink)
Neuer User
 
Registriert seit: Oct 2002
Beiträge: 102
Sorry wenn ich mich unklar ausgedrückt habe, aber ich meinte den callstack im Flashplayer - den kannst Du in einem Panel im Debugger sehen. 30-40 Funktionen heisst in dem Fall, das ebensoviele im Stack liegen. (Hehe das Projekt selber hat ca 20k reinen Code, also ein "paar" mehr sinds schon) Bei jedem Aufruf wird die Funktion im Stack gespeichert und bleibt so lange liegen, bis sie beendet wird. Wenn eine Funktion nun eine andere Funktion aufruft, wird diese auf den Stack quasi "obendrauf" gelegt und kann ebenfalls erst bei Beendigung wieder entfernt werden. Besonders heftig wird das schnell bei rekursiven Funktionen die sich quasi selber aufrufen.

Damit folgt der Stack dem "LIFO" (Last In First Out) Prinzip, dh er kann nur beginnend mit der aktuellen Funktion abgeräumt werden. So ein Stack wird eben oft verwendet um der CPU eine Liste zum Abarbeiten der Befehle zu liefern. Ich hoffe die Erklärung war OK, mehr dazu bei http://de.wikipedia.org/wiki/Stapelspeicher und anderswo

Sooo. So ein Speicher ist natürlich nicht endlich, im Gegenteil eher sehr begrenzt und so kann es zu einem Überlauf des Stapels kommen. Böse Sache das! Bei Flash heisst das nix anderes, dass Schicht im Schacht ist, die Fehlermeldung "256 Rekursionsstufen überschritten ... " oder so kennt der eine oder andere vielleicht.

Das Limit scheint also 256 Stufen zu sein, sprich eine Funktion kann maximal 255 weitere aufrufen. Deswegen also meine Besorgnis, dass diese Grenze niemals überschritten wird, denn wenn so was im Browser beim User passiert, wird das nicht schön ausgehen!

Der Trick mit dem setInterval funktioniert eben deswegen, weil nach setInterval die aufrufende Funktion normal beendet wird und erst dann aufgerufen (auch mit 1ms!), wenn Flash alle noch bestehenden Funktionen auf dem Stack gecleared hat.

Sooo. Kann keiner mehr sagen, ich hätte mit meiner Frage gleichzeitig nix zur Erleuchtung beigetragen also nochmal:

irgendwelche callstack Experten hier ???? *wink* *grins*
frankiee ist offline   Mit Zitat antworten
Alt 27-03-2006, 19:32   #5 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
ich vermute schon das 256 die maximale größe ist, da rekursion nichts anderes ist, also von daher wird dir das interval sicherlich helfen. Meiner erfahrung nach erreicht man diese limit aber meißtens nicht, bzw ich habs noch nie erreicht .

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 27-03-2006, 19:49   #6 (permalink)
Neuer User
 
Registriert seit: Oct 2002
Beiträge: 102
Ich würde das mit den 256 Stack-Entries leider schaffen, wenn mein Viewtree (es geht um eine Art Presenter, welcher baumartige Viewstrukturen aufbaut) sagen wir mal so 8-10 Ebenen hat. (in die Tiefe wohlgemerkt - könnte man im Extremfall schon mal brauchen).

Dabei sollen die Views auch noch je nach view synchron und asynchron auf den Schirm gebracht werden, es gibt viel messaging usw. Die Datenübergabe zwischen Model, View und Controller ist ebenfalls komplett asynchron, so dass man nicht mal schnell was mit return übergeben kann, ich muss jedesmal einen Event abfeuern - und wieder eine Funktion mehr aufm Stack, vor allem wenn die Empfängerfunktion wiederum weitere Schritte veranlassen möchte >> wieder ein Broadcast etc.

Ich hoffe Ihr versteht was ich meine - wie löst Ihr sowas dann wenn es kein Prob bei Euch ist?
frankiee ist offline   Mit Zitat antworten
Alt 27-03-2006, 19:53   #7 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 923
Normalerweise ist es ziemlich schwierig, die 256 gleichzeitigen Funktionsaufrufe zu erreichen. 40 kommt mir auch schon viel vor, obwohl ich es noch nie konkret gemessen habe.

Wenn du Probleme mit rekursiven Funktionen hast, gibt es zwei mögliche Ansätze. Du könntest die erlaubte Rekursionstiefe hochsetzen, z.B. mit hamtasc oder mit Flex. Oder du wandelst die rekursive Funktion in eine iterative Funktion um und verwaltest den Stack selbst. Das ist vielleicht nicht besonders elegant, aber im Einzelfall eventuell trotzdem möglich.

Edit:
Achso, das Problem mit dem TreeViewer habe ich erst später gesehen. Wäre es vielleicht möglich, erst die Unterbäume durchzuarbeiten. Im Zweifelsfall Ebene für Ebene?



mfg. h
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D

Geändert von hazy fantazy (27-03-2006 um 20:03 Uhr)
hazy fantazy ist offline   Mit Zitat antworten
Alt 27-03-2006, 20:00   #8 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
na wie gesagt ich baue den screen erst dann auf wenn ich ihn brauche also nicht im vorfeld, wenn er einmal aufgebaut ist wandert er in den "cache" und gut ist. jedesmal wenn ich ihn dann brauch rufe ich den cache ab und aktualisiere nur die komponenten die bedarf an neuem futter haben.

im schnitt hab ich 5 - 10 navi elemente und 3-6 content element je screen die wechseln, manchmal bleicbt der screen auch der gleiche und es ändert sich nur der content und da komme ich nie auf nen stack overflow

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 27-03-2006, 20:06   #9 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 923
@atothek: Wenn ich das richtig verstanden habe, dann geht es darum, einen Baum darzustellen, der z.B. eine Tiefe von 500 hat. Wenn man dabei rekursiv vorgehen würde, würde man ja auf jeden Fall über die 256 kommen.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 27-03-2006, 20:12   #10 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
stichwort einen tree zu durchwandern ohne rekursion dann bitte hier lang

XML Iterator

ich hab halt gedacht es geht um einen darstellung eines gesammten screens innerhalb einen projectes, naja wie auch immer

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 27-03-2006, 21:09   #11 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
Bei solchen Monsterbäumen solltest du den Vorgang sowiso zerlegen, ich schätze mal die 15s Grenze sollte dir eher zu schaffen machen, als die 256 Rekursionsstufen.
Mein aktuelles Projekt hat 130 eigene Klassen mit insgesammt gut 500KByte Code + fette Abhängigkeit von nem Framework, aber selbst wenn die Fenstergröße verändert wird, oder vom Server ein Event kommt, hab ich maximal ca. 40 Aufrufe geschachtelt, allerdings einige in Schleifen, weshalb die 15s mein größter Feind sind.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 27-03-2006, 21:27   #12 (permalink)
Neuer User
 
Benutzerbild von Xeef
 
Registriert seit: Sep 2004
Ort: Spain/Ibiza
Beiträge: 942
aha !

hab blos bahnhof verstanden bei "stak und flash" ist mir eher im zusamenhang
assembrel bekant

hab ich hier irgend ein logic fehler ??

wen nicht kosten events 1-2 jenach dem was man benutzt

Code:
    for (a=0; a<127; a++) {     _root[a] = {};     _root[a].a = a;     AsBroadcaster.initialize(_root[a]);     Obj = {};     _root[a].Do = function(s) {         _global.Func++;         trace("Reciver:"+this.a+" Sender:"+s+"    Functions:"+Func);         this.broadcastMessage("Do", this.a);         trace("Exit :"+this.a);         _global.Func--;     };     _root[(a-1)].addListener(_root[a]); } _global.Func = 0; _root["0"].broadcastMessage("Do", 0); // /////////////////////////// // for (a=0; a<85; a++) {     _root[a] = {};     _root[a].a = a;     _root[a].dispatchEvent = function() {     };     _root[a].addEventListener = function() {     };     _root[a].removeEventListener = function() {     };     _root[a].T = function() {     };     mx.events.EventDispatcher.initialize(_root[a]);     _root[a].Do = function(Data) {         _global.Func++;         trace("Reciver:"+this.a+" Sender:"+Data.Id+"    Functions:"+Func);         this.dispatchEvent({type:"Do", Id:this.a});         trace("Exit :"+this.a);         _global.Func--;     };     _root[(a-1)].addEventListener("Do", _root[a]); } _global.Func = 0; _root[0].dispatchEvent({type:"Do", Id:0});

bei hoheren "a" s gibts ein abbruch
__________________
Languages : (in the order of knowledge/preference)
Read: Flash AS, PHP, JS, Html, DHtml, Basic, C++, DOS, 3DMaxScript, English, Deutsch, Magyar, XML, Pascal, VB, Spanish
Write: Flash AS, Basic, PHP, JS, DHtml, Html, ..., C++, ...., ..., English, ..., ..., ..., ...., Deutsch, ..., Magyar

wen du mein deutsch nicht magst whele eine andere sparache von den obrigen ;)
Xeef ist offline   Mit Zitat antworten
Alt 27-03-2006, 21:32   #13 (permalink)
Neuer User
 
Benutzerbild von Xeef
 
Registriert seit: Sep 2004
Ort: Spain/Ibiza
Beiträge: 942
ich weis nicht

ich kan mir nicht vorstelen 40 functionen zu sachteln

wie sit dan sowas aus kan mir jemand ein beispiel geben ?

ich kan mir nicht mall 10 vorstelen !
__________________
Languages : (in the order of knowledge/preference)
Read: Flash AS, PHP, JS, Html, DHtml, Basic, C++, DOS, 3DMaxScript, English, Deutsch, Magyar, XML, Pascal, VB, Spanish
Write: Flash AS, Basic, PHP, JS, DHtml, Html, ..., C++, ...., ..., English, ..., ..., ..., ...., Deutsch, ..., Magyar

wen du mein deutsch nicht magst whele eine andere sparache von den obrigen ;)
Xeef ist offline   Mit Zitat antworten
Alt 27-03-2006, 21:36   #14 (permalink)
Neuer User
 
Registriert seit: Oct 2002
Beiträge: 102
yoa atothek, das mit Deinem Iterator habe ich mir schon angeschaut, hilft mir hier aber auch nicht weiter. Mein Problem ist ja nicht wirklich die Rekursion, sondern die endlose Verkettung von Events und Funktionsaufrufen in meinem Framework - da reicht ein bischen Rekursion schon aus, um mich in Schwierigkeiten zu bringen. Eine Tiefe von 256 View-Ebenen brauch ich daher auch nicht, da schon der Aufbau einer Ebene mindestens 6 verkettete Aufrufe erzeugt, also das Problem taucht schon eher auf.

Das Problem liegt auch glaub ich darin begründet, dass das zB das Model bei einem Daten Request, wenn diese Daten bereits vorrätig sind, diese sofort per Broadcast wieder zurückschickt, wobei das "zurück" ja in dem Fall leider nicht gilt. In dem Fall hab ich nämlich die ganze sch... Kette vom Request bis zum Ergebnis zurück aufm Stack.

Noch vertrackter wirds beim Aufbau der Views, wo eine view je nach Typ seriell, paralell, bzw. synchron oder asynchron aufgebaut werden kann. Hier kanns sein, dass Rekursionen entstehen, weil die Funktion, die die einzelnen Schritte abarbeitet getriggert werden muss, obwohl sie noch in einer Schleife steckt. (Bei einer view die paralell, also ohne auf Beendigung von show() zu warten und asynchron, also mit einer Zeitdauer zwischen show() und showComplete() erzeugt wird, während die Schleife weiter vorne durch eine serielle und asynchrone view angehalten wurde) Weiss nicht wirklich was ich hier mit einem iterator soll

Ich denke die Lösung liegt wirklich darin, alle Befehlsketten, die wahlweise asynchron oder synchron abgearbeitet werden können, asynchron zu gestalten, und zwar mit setInterval. Mich ärgert das halt ein bischen, weil ich es weder elegant nocht performant finde
frankiee ist offline   Mit Zitat antworten
Alt 27-03-2006, 22:03   #15 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 923
Eine elegante Lösung gibt es da wohl nicht, denn das Problem liegt ja eigentlich in der künstlichen Beschränkung auf 256 Rekursionsstufen. Keine andere Programmiersprache, die ich kenne, hat sowas.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele