2014 While
ist zurück
Denken Sie einfach logisch.
Schau dir das an
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Es müssen mindestens 2 Variablen (Index, Länge) erstellt werden.
- Sie müssen überprüfen, ob der Index kleiner als die Länge ist
- Der Index muss erhöht werden
- Die
for
Schleife hat 3 Parameter
Sagen Sie mir jetzt, warum dies schneller sein sollte als:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Eine Variable
- Keine Schecks
- der Index wird verringert (Maschinen bevorzugen das)
while
hat nur einen Parameter
Ich 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.
Das eigentliche Problem ist eigentlich die Dom-Manipulation / Renderzeit / Zeichenzeit oder wie auch immer Sie es nennen möchten.
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 / klonen
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Beachten Sie die Einrichtung der Parameter:
- Wie in der while-Schleife verwende ich nur eine Variable
- Sie müssen überprüfen, ob der Index größer als 0 ist.
- Wie Sie sehen können, unterscheidet sich dieser Ansatz von der normalen for-Schleife, die jeder verwendet, da ich Dinge innerhalb des 3. Parameters mache und auch direkt innerhalb des Arrays abnehme.
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:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
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 vorherige for
und die vorherige Schleife while
.
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/