Ich habe aus Büchern gelernt, dass man so eine Schleife schreiben sollte:
for(var i=0, len=arr.length; i < len; i++){
// blah blah
}
Das arr.length
wird also nicht jedes Mal berechnet.
Andere sagen, dass der Compiler dies optimieren wird, sodass Sie einfach schreiben können:
for(var i=0; i < arr.length; i++){
// blah blah
}
Ich möchte nur wissen, welcher Weg in der Praxis der beste ist.
javascript
performance
loops
wong2
quelle
quelle
for ... of
Schleife in diesen Wettbewerb einführen ? Die Syntax scheint noch einfacher zu sein als eine for-Schleife ohne Caching, und ich möchte wissen, ob ich zur Verwendung von for of-Schleifen wechseln soll.Antworten:
Nach diesem Test mit den meisten modernen Browsern ...
http://jsben.ch/dyM52
Derzeit die schnellste Form der Schleife (und meiner Meinung nach die syntaktisch offensichtlichste).
Ein Standard für Schleifen mit Längen-Caching
Ich würde sagen, dass dies definitiv ein Fall ist, in dem ich Entwickler von JavaScript-Engines begrüße. Eine Laufzeit sollte aus Gründen der Klarheit und nicht der Klugheit optimiert werden .
quelle
++i
.for(var i=0, len=myArray.length; i<len; ++i)
Überprüfen Sie jsperf.com/caching-array-length/84var
Anweisung deklarieren . Wie es geschrieben steht,len
ist tatsächlich so, wie Sie es vorschlagen.Der absolut schnellste Weg, um ein Javascript-Array zu durchlaufen, ist:
Einen vollständigen Vergleich finden Sie unter http://blogs.oracle.com/greimer/entry/best_way_to_code_a
quelle
var
(sonstlen
wird eine globale Variable). Weitere Loop-Benchmarks finden Sie unter jsperf.com/loops .Ab Juni 2016 werden einige Tests in neuestem Chrome durchgeführt (71% des Browsermarktes im Mai 2016 und mehr):
Ich glaube, dieser Thread ist zu alt und es ist irreführend, wenn Programmierer glauben, sie müssten die Länge zwischenspeichern oder Reverse-Traversing mit Dekrementen verwenden, um eine bessere Leistung zu erzielen. Sie schreiben Code, der weniger lesbar und fehleranfälliger ist als eine einfache unkomplizierte for-Schleife. Daher empfehle ich:
Wenn Ihre App viele Elemente durchläuft oder sich Ihr Schleifencode in einer häufig verwendeten Funktion befindet, ist eine einfache for-Schleife die Antwort:
Wenn Ihre App nicht wirklich viele Elemente durchläuft oder Sie hier und da nur kleine Iterationen durchführen müssen, ist die Verwendung des Standard-forEach-Rückrufs oder einer ähnlichen Funktion aus der JS-Bibliothek Ihrer Wahl möglicherweise verständlicher und weniger fehleranfällig, da Der Bereich der Indexvariablen ist geschlossen und Sie müssen keine Klammern verwenden, um direkt auf den Array-Wert zuzugreifen:
Wenn Sie wirklich ein paar Millisekunden kratzen müssen, während Sie über Milliarden von Zeilen iterieren, und sich die Länge Ihres Arrays während des Vorgangs nicht ändert, können Sie die Länge in Ihrer for-Schleife zwischenspeichern. Obwohl ich denke, dass dies heutzutage wirklich nicht notwendig ist:
quelle
for(let i=0, j=array.length; i < j; i++)
die Vorwärtsbewegung für Schleifen erheblich beschleunigen. Bei einigen Tests habe ich gewonnen, bei den meisten lag es innerhalb der Fehlergrenze oder der Rückwärtsschleife.Wenn die Reihenfolge nicht wichtig ist, bevorzuge ich diesen Stil:
Es speichert die Länge zwischen und ist viel kürzer zu schreiben. Es wird jedoch in umgekehrter Reihenfolge über das Array iteriert.
quelle
i--
eine Nummer zurück und sobald die Nummer ist, liegt0
die Bedingungfalse
daranBoolean(0) === false
.Es ist erst 2018, also könnte ein Update schön sein ...
Und ich muss der akzeptierten Antwort wirklich widersprechen . Es wird in verschiedenen Browsern verschoben. Einige arbeiten
forEach
schneller, andere schneller,for-loop
und andere sindwhile
hier ein Benchmark für alle Methoden http://jsben.ch/mW36eund da Sie eine Menge for-Schleifen sehen können
for(a = 0; ... )
, ist es erwähnenswert, dass ohne 'var' Variablen global definiert werden und dies die Geschwindigkeit dramatisch beeinflussen kann, so dass es langsam wird.Duffs Gerät läuft in der Oper schneller, aber nicht in Firefox
quelle
2014
While
ist zurückDenken Sie einfach logisch.
Schau dir das an
for
Schleife hat 3 ParameterSagen Sie mir jetzt, warum dies schneller sein sollte als:
while
hat nur einen ParameterIch war total verwirrt, als Chrome 28 zeigte, dass die for-Schleife schneller ist als die Weile. Das muss irgendwie ben gewesen sein
"Äh, jeder benutzt die for-Schleife. Konzentrieren wir uns darauf, wenn wir für Chrome entwickeln."
Aber jetzt, im Jahr 2014, ist die while-Schleife wieder auf Chrom. es ist 2 mal schneller, in anderen / älteren Browsern war es immer schneller.
In letzter Zeit habe ich einige neue Tests gemacht. In der realen Welt sind diese Funktionscodes nichts wert und jsperf kann die while-Schleife nicht richtig ausführen, da die array.length neu erstellt werden muss, was ebenfalls Zeit kostet.
Sie können nicht die tatsächliche Geschwindigkeit einer while-Schleife auf jsperf erhalten.
Sie müssen Ihre eigene benutzerdefinierte Funktion erstellen und dies mit überprüfen
window.performance.now()
Und ja ... die while-Schleife ist auf keinen Fall einfach schneller.
Zum Beispiel habe ich eine Canvas-Szene, in der ich die Koordinaten und Kollisionen berechnen muss ... dies geschieht zwischen 10 und 200 Mikrosekunden (nicht Millisekunden). Es dauert tatsächlich verschiedene Millisekunden, um alles zu rendern. Wie in DOM.
ABER
Es gibt eine andere super performante Möglichkeit,
loop
in einigen Fällen das for zu verwenden, um beispielsweise ein Array zu kopieren / klonenBeachten Sie die Einrichtung der Parameter:
Dies bestätigt, dass Maschinen wie die -
Schreiben, dass ich dachte, es ein wenig kürzer zu machen und einige nutzlose Sachen zu entfernen, und schrieb dieses mit dem gleichen Stil:
Selbst wenn es kürzer ist, sieht es so aus, als würde
i
eine weitere Verwendung alles verlangsamen. Es ist 1/5 langsamer als die vorherigefor
und die vorherige Schleifewhile
.Hinweis: Das
;
ist sehr wichtig nach dem für looo ohne{}
Auch wenn ich Ihnen gerade gesagt habe, dass jsperf nicht der beste Weg ist, um Skripte zu testen. Ich habe diese 2 Schleifen hier hinzugefügt
http://jsperf.com/caching-array-length/40
Und hier ist eine weitere Antwort zur Leistung in Javascript
https://stackoverflow.com/a/21353032/2450730
Diese Antwort soll performante Möglichkeiten zum Schreiben von Javascript aufzeigen. Wenn Sie das nicht lesen können, fragen Sie und Sie erhalten eine Antwort oder lesen ein Buch über Javascript http://www.ecma-international.org/ecma-262/5.1/
quelle
for
schneller waren als diewhile
, und ich habe einmal auf crome-dev gelesen, dass es genau aus dem Grund war, den Sie erwähnen. Es wäre nur eine Frage der Zeitwhile
, bis sie wieder aufholen würden. Von diesem Punkt an, die Logik in dem ersten Teil Ihrer Antwort halten wird (wieder einmal, yay!) Moderne Implementierungen folgen jedoch nicht mehr starr jedem von Ecma festgelegten Schritt (sie optimieren). Da Ihr Motor jetzt nicht mehr der auffälligste Flaschenhals ist, kann man jetzt tatsächlich die CPU-Cache-Fehler in Rückwärtsschleifen feststellen !http://jsperf.com/caching-array-length/60
Die letzte Testversion, die ich vorbereitet habe (indem ich eine ältere wiederverwendete), zeigt eines.
Die Caching-Länge ist nicht so wichtig, schadet aber nicht.
Jeder erste Testlauf, der oben verlinkt ist (auf der frisch geöffneten Registerkarte), liefert die besten Ergebnisse für die letzten 4 Snippets (3., 5., 7. und 10. in Diagrammen) in Chrome, Opera und Firefox in meinem Debian Squeeze 64-Bit ( meiner Desktop-Hardware) ). Nachfolgende Läufe ergeben ein ganz anderes Ergebnis.
Leistungsbezogene Schlussfolgerungen sind einfach:
!==
anstelle von<
.shift()
Array ebenfalls effizient.tl; dr
Heutzutage (2011.10) scheint das folgende Muster das schnellste zu sein.
Beachten Sie, dass das Caching
arr.length
hier nicht entscheidend ist. Sie können also nur testen, ob diei !== arr.length
Leistung sinkt, aber Sie erhalten kürzeren Code.PS: Ich weiß, dass ein Snippet mit
shift()
seinem Ergebnis verwendet werden kann, anstatt auf das 0. Element zuzugreifen, aber ich habe das irgendwie übersehen, nachdem ich die vorherige Revision (die falsche while-Schleifen hatte) wiederverwendet habe, und später wollte ich die bereits erhaltenen Ergebnisse nicht verlieren.quelle
"Best" wie bei reiner Leistung? oder Leistung UND Lesbarkeit?
Reine Leistung "am besten" ist dies, die einen Cache und den ++ Präfixoperator verwendet (meine Daten: http://jsperf.com/caching-array-length/189 )
Ich würde argumentieren, dass die for-Schleife ohne Cache das beste Gleichgewicht zwischen Ausführungszeit und Lesezeit des Programmierers darstellt. Jeder Programmierer, der mit C / C ++ / Java gestartet ist, verschwendet keine ms, um diese durchzulesen
quelle
len
Name ist, man müsste immer eine doppelte Aufnahme dieser ersten Schleife machen. Die Absicht der zweiten Schleife ist offensichtlich.** Cache die Array-Länge innerhalb der Schleife, einige Sekunden Zeit werden verstrichen. Abhängig von den Elementen im Array, wenn mehr Elemente im Array vorhanden sind, gibt es einen großen Unterschied in Bezug auf Ms der Zeit *
** **.
** **.
** **.
** **.
quelle
Dies scheint bei weitem der schnellste Weg zu sein ...
Berücksichtigen Sie, dass dies das Array verbraucht, es isst und nichts mehr übrig lässt ...
quelle
arr.shift();
Stattdessenarr.pop()
kann eine Array-Umkehrung vermieden werden.Es ist das Jahr 2017 .
Ich habe einige Tests gemacht.
https://jsperf.com/fastest-way-to-iterate-through-an-array/
Die
while
Methode scheint in Chrome die schnellste zu sein.Sieht aus wie die linke Abnahme (
--i
) ist viel schneller als die andere (++i
,i--
,i++
) auf Firefox.Dieser Ansatz ist der Fasten im Durchschnitt. Das Array wird jedoch in umgekehrter Reihenfolge wiederholt.
Wenn die Vorwärtsreihenfolge wichtig ist, verwenden Sie diesen Ansatz.
quelle
let
Sie tatsächlich die Leistung der Bereichserstellung anstelle der Schleifenleistung. Durch die Verwendunglet i = 0, ii = array.length
in Ihrenfor
Schleifen wird ein neuer Bereich für diese Variablen innerhalb desfor
Blocks erstellt. Ihrewhile
Beispiele erstellen keinen neuen Bereich für die Variablen innerhalb deswhile
Blocks und sind daher schneller. Wenn Sievar
anstelle vonlet
for-Schleifen verwenden, werden Sie sehen, dass for-Schleifen 2017 immer noch so schnell wie whiles sind, aber besser lesbar.var
undlet
haben die gleiche Leistung - stackoverflow.com/a/32345435/1785975while
in Chrome schneller sein" nicht richtig. Dies ist nur bei Verwendunglet
aufgrund von Leistungsproblemen dieses Keywords in Chrome möglich. Wenn Sievar
oder mit anderen Browsern verwendenfor
undwhile
ziemlich gleich sind,for
ist dies je nach Benchmark manchmal sogar noch schneller und imho kompakter und lesbarer.Ich schreibe immer im ersten Stil.
Auch wenn ein Compiler intelligent genug ist, um ihn für Arrays zu optimieren, aber dennoch intelligent, wenn wir hier DOMNodeList oder ein kompliziertes Objekt mit berechneter Länge verwenden?
Ich weiß, was die Frage über Arrays ist, aber ich denke, es ist eine gute Praxis, alle Ihre Loops in einem Stil zu schreiben.
quelle
i ++ ist schneller als ++ i, --i und i--
Sie können auch die letzte Zeile speichern, die arr [i ++] ausführt, wenn Sie das letzte Mal auf i zugreifen müssen (dies kann jedoch schwierig zu debuggen sein).
Sie können es hier testen (mit anderen Schleifentests): http://jsperf.com/for-vs-whilepop/5
quelle
++i
ist schneller ...Ab September 2017 zeigen diese jsperf-Tests, dass das folgende Muster unter Chrome 60 am leistungsfähigsten ist:
Kann sich jemand reproduzieren?
quelle
Ich habe einige andere Möglichkeiten ausprobiert, um ein großes Array zu iterieren, und festgestellt, dass das Halbieren der Array-Länge und das anschließende Iterieren beider Hälften in einer einzigen Schleife schneller ist. Dieser Leistungsunterschied kann bei der Verarbeitung großer Arrays festgestellt werden .
Einige Leistungsvergleiche (unter Verwendung von timer.js) zwischen der for-Schleife mit zwischengespeicherter Länge und der obigen Methode.
http://jsfiddle.net/tejzpr/bbLgzxgo/
quelle
Ein weiterer jsperf.com-Test: http://jsperf.com/while-reverse-vs-for-cached-length
Die umgekehrte while-Schleife scheint die schnellste zu sein. Das einzige Problem ist, dass while (--i) bei 0 stoppt. Wie kann ich dann in meiner Schleife auf Array [0] zugreifen?
quelle
while (i--)
wird die Wahrhaftigkeit voni
vor dem Dekrementieren geprüft, anstatt zu dekrementieren und dann die Wahrhaftigkeit zu testen.Eine einfache while-Schleife ist oft die schnellste. jsperf.com ist eine großartige Sandbox, um diese Art von Konzepten zu testen.
https://jsperf.com/fastest-array-loops-in-javascript/24
quelle
While-Schleife ist etwas schneller als for-Schleife.
Verwenden Sie stattdessen die while-Schleife
quelle
Der schnellste Ansatz ist der traditionelle for-Loop. Hier ist ein umfassenderer Leistungsvergleich.
https://gists.cwidanage.com/2019/11/how-to-iterate-over-javascript-arrays.html
quelle
Die eleganteste Lösung, die ich kenne, ist die Verwendung einer Karte.
quelle
Versuche dies:
quelle
Der schnellere Weg, ein Array zu schleifen, ist die Verwendung des Filters. Die filter () -Methode erstellt ein neues Array mit allen Elementen, die den von der bereitgestellten Funktion implementierten Test bestehen.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Aus meiner Erfahrung bevorzuge ich immer Filter, Karten usw.
quelle
Ab 2019 ist WebWorker beliebter geworden. Bei großen Datenmengen können wir WebWorker verwenden, um durch die vollständige Nutzung von Multi-Core-Prozessoren viel schneller zu verarbeiten.
Wir haben auch Parallel.js, die die Verwendung von WebWorker für die Datenverarbeitung erheblich vereinfachen.
quelle