while(true) vs setInterval(function(),0) [duplicate]

Lesezeit: 5 Minuten

Benutzeravatar von Ali Bassam
Ali Bassam

setInterval()

Ruft eine Funktion auf oder führt ein Code-Snippet wiederholt aus, mit einer festen Zeitverzögerung zwischen jedem Aufruf dieser Funktion.

während()

Erstellt eine Schleife, die eine angegebene Anweisung ausführt, solange die Testbedingung wahr ist. Die Bedingung wird vor der Ausführung der Anweisung ausgewertet.

Wenn ich benutze while(true) um eine bestimmte Anweisung auszuführen, stürzt mein Browser entweder ab (Feuerfuchs), hinkt (Oper), oder die Anweisung wird nicht ausgeführt (Chrom), aber wenn ich verwendet setInterval() mit einer festen Zeit von 0 Sekundenalles funktioniert perfekt, obwohl es nur 0 Sekunden dauert, und while(true) kann logischerweise nicht schneller als 0 Sekunden sein, aber warum passiert das?

während() Beispiel:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            while (true)
            {
                document.getElementById("counter").innerHTML += i++; 
            }
        </script>
    </body>
</html>

setInterval() Beispiel:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            setInterval(function() { counter() }, 0);
            function counter()
            {
               document.getElementById("counter").innerHTML += i++;
            }
        </script>
    </body>
</html>

Es gibt einen großen Unterschied, der das Sperren betrifft. Der erste Ansatz, der while Schleife wird die CPU des Benutzers sperren, weil sie für immer läuft, ohne anzuhalten, und 100% des Prozessors belegt. setInterval hat tatsächlich einen Mindestbetrag, der implizit ist und vom Browser abhängt. Ich glaube so um die 10ms. Also dein setInterval läuft eigentlich nur etwa eine Millisekunde lang und macht dieses einfache Update einmal alle 10 ms. Dies ist hart für den Prozessor, erfordert jedoch nicht 100 % des Prozessors und kann durch die Aufgabenverwaltung durch das Betriebssystem gemildert werden.

Benutzeravatar von fresskoma
fresskoma

  • while(1) erzeugt eine Endlosschleife, d.h. JavaScript läuft einfach ewig und weiter noch nie die Kontrolle an den Browser zurückzugeben, der dafür einfriert, weil er nie wieder etwas anderes kann (bis das Skript beendet wird).

  • setTimeout(func, 0) verhält sich anders in dem Sinne, dass nach der Ausführung die Kontrolle an den Browser zurückgegeben wird, der dann entscheiden kann, was danach zu tun ist. 0ms einstellen setTimeout garantiert nicht dass der JavaScript-Code direkt nach dem Stoppen ausgeführt wird. Mit dem 0ms-Parameter teilen Sie dem Browser lediglich mit, dass Sie möchten, dass der Code direkt nach dem Stoppen ausgeführt wird, aber dem Browser steht es frei, etwas ganz anderes zu tun, bevor er dies tatsächlich tut.

  • Du meinst wahrscheinlich while(1).

    – das System

    12. Februar 2013 um 20:03 Uhr

  • Das tue ich übrigens 😀

    – Fresskoma

    12. Februar 2013 um 20:06 Uhr

Benutzeravatar von Frances McMullin
Frances McMullin

Javascript in Browsern ist eingängig und ereignisgesteuert. Niemals laufen zwei Dinge gleichzeitig, und die Ereignisschleife ist König. Wenn Ihr JS niemals die Kontrolle über den einzelnen Thread aufgibt (durch Beenden einer Funktion), kann nichts anderes den Thread verwenden. Derselbe Thread behandelt JS und DOM, sodass der Benutzer nicht einmal scrollen oder auf irgendetwas klicken kann, wenn Ihr JS den Thread in Beschlag nimmt.

setInterval (oder tatsächlich setTimeout) mit einer Verzögerung von 0 (Millisekunden, nicht Sekunden) bedeutet nur, dass diese Funktion nach der angegebenen Verzögerung zur Ereigniswarteschlange hinzugefügt wird, es gibt keine Garantie, dass die Funktion genau zu diesem Zeitpunkt ausgeführt wird.

BEARBEITEN: Tatsächlich können Webworker JS gleichzeitig mit dem Hauptbrowser-Thread ausführen, aber sie sehen nicht denselben Speicher / können nicht auf das DOM zugreifen, sodass die obigen Punkte / Annahmen immer noch gelten. .. Wenn Sie in Web Worker einsteigen möchten, benötigen Sie ein ziemlich gutes Verständnis von JS / funktionaler Programmierung.

EDIT (erneut): Warum willst du für immer loopen? Wenn Sie Umfragen durchführen (der einzige Grund, der mir einfällt), tun Sie das bitte nicht. Es gibt fast immer einen besseren Weg, besonders in JS. Der funktionale Weg besteht darin, die Funktion zu definieren, die ausgeführt werden soll, wenn ein Ereignis eintritt (das, was Sie abgefragt haben), und diese Funktion dann an das Ereignis anzuhängen (wie Sie dies tun, hängt vom Ereignis ab).

  • Nit: Ich habe “in Browsern” hinzugefügt. Die ECMAScript-Spezifikation schließt Threading nicht ausschließlich aus.

    Benutzer166390

    12. Februar 2013 um 19:57 Uhr


  • @pst, ganz richtig, danke =)

    – Frances McMullin

    12. Februar 2013 um 20:03 Uhr

  • Das “Ereignis nach der angegebenen Verzögerung zur Warteschlange hinzufügen” hat mich endlich verstanden. Dies sollte die beste Antwort sein

    – drakonli

    29. September 2020 um 8:15 Uhr

while(true) blockiert jede Ausführung, bis die bedingte Schleife beendet ist, von der wir bereits wissen, dass sie niemals passieren wird. (Chrom)

setInterval weist die Umgebung an, alle x Millisekunden beliebigen Code auszuführen, es blockiert Ihren Browser nicht, da der “Scheduler” immer noch die Kontrolle hat.

Haben Sie einen bestimmten Grund, eine Endlosschleife zu verwenden und sogar das DOM bei jedem Schritt zu manipulieren?

Wenn Sie die verwenden while Schleife wird höchstwahrscheinlich den Browser und den Client vollständig sperren, was auch zu einer möglichen CPU-Überlastung führen kann, wenn sie nicht in irgendeiner Weise beendet wird.

Die Schleife while versucht, seine Arbeit in möglichst wenigen Mikrosekunden zu erledigen. Es kann also sogar versuchen, eine Million Schritte in einer möglichen Sekunde auszuführen, und vielleicht sogar noch mehr, in diesem Fall hängt es vom Client ab. Bei dieser Geschwindigkeit wäre jedoch eine Aktualisierung des DOM nicht möglich.

Im Fall für setIntervales ist ganz anders als while Schleife, eigentlich ist es angemessener, sie a zu nennen function repeater. Es wiederholt die angegebene Funktion, nachdem die angegebene Zeit verstrichen ist. Selbst wenn die Zeit 0 ist, hat es einen Schritt, in dem es überprüft if the waiting time has passed now, and should the next repeat be run.

Sie können also eine While-Schleife in Betracht ziehen sofortiger als 0 Sekunden Verzögerung.

  • Das tue ich, ich muss Echtzeitwarnungen für Werte ausführen, die sich ständig ändern, Warnungen überprüfen, erneut ausführen, erneut ausführen und unendlich weitermachen

    – PirateApp

    11. Oktober 2018 um 14:18 Uhr

  • Das tue ich, ich muss Echtzeitwarnungen für Werte ausführen, die sich ständig ändern, Warnungen überprüfen, erneut ausführen, erneut ausführen und unendlich weitermachen

    – PirateApp

    11. Oktober 2018 um 14:18 Uhr

1429980cookie-checkwhile(true) vs setInterval(function(),0) [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy