Antwort an „Michael_K“ verfassen

Ich wollte euch beiden noch einmal danken. Das hat mir wirklich geholfen, in kurzer Zeit eine akzeptable Lösung zu finden (+ Extrawissen).

Im Ergebnis habe ich einen Mix aus beiden Lösungen gewählt. Die setTimeout(()=>{},0) ist zwar einfach zu implementieren, hat aber den Nachteil, dass diese die Abarbeitung im Main-Thread erheblich verlangsamen kann (je nachdem, wie oft das setTimeout aufgerufen wird. Im Ergebnis war es bei mir weit über 500% mehr Berechnungszeit.

Der Ansatz von Rolf mit einem Generator ist schick, hat aber den Nachteil, dass man ggfs. an sehr vielen Stellen diesen Mechanismus einbauen muss bzw. die Abläufe so umschreiben muss, dass zunächst alle Aufgaben in einem Stack gesammelt werden und dann die Abarbeitung erfolgt. Es kann das Problem auftreten, dass die Abarbeitung selbst zu lange dauert und man diese dann ggfs. in Untertask aufteien muss. Dies in bestehende Softwarestrukturen einzuarbeiten kann viel Aufwand bedeuten, den Code neu zu schreiben.

Im Ergebnis habe ich mich dazu entschlossen, die angefallene Zeit pro Task in einer lokalen Variable aufzusummieren, am Ende eines Task wird dann überprüft, ob die aufsummierte Zeit einen selbst gesetzten Grenzwert überschreitet. Der Grenzwert von 100ms von Rolf ist da wirklich eine gute Richtgröße. Kurzum:

Sofern die aufsummiert Zeit der bereits durchgeführten Tasks diesen Grenzwert überschreitet, wird der aktuelle Task dann mit setTimeout(()=> { resolve()},0) beendet und die aufsummierte Zeit auf 0 zurückgesetzt, wenn die aufsummierte Zeit noch unter dem Grenzwert liegt, wird der Task mit einem einfache Promise.resolve() abgeschlossen. Das funktioniert erstaunlich gut und hat zudem den Vorteil, dass man sehr flexibel das an verschiednen Stellen einbauen kann. Im Ergebnis läuft es jetzt absolut flüssig und die Berechnung benötigt ca. 20% länger als mit eingefrorenen Main-Thread.

Ich bleibe aber dabei, dass es schön wäre, wenn man zusätzlich zumindest einen "freezed" Dom erstellen könnte (ausserhalb vom main-thread), damit man so etwas noch performanter lösen kann. In meiner aktuellen Lösung "langweilen" sich die CPU cores, die nicht den main-thread abarbeiten.

Gruss Michael

freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen