Kann jemand erklären, wie diese Schleife es schafft, so hoch zu benchmarken?

8

Ссылка

Wenn Sie sehen, verwaltet die folgende Schleife einige verrückte Benchmarks:

%Vor%

Er erreicht ~ 700 Millionen Ops / Sek. in FF, ~ 20 Mil. in Chrome und ~ 50 Mil. in IE10. Die nächstschnellste Schleife schafft ~ 100k in FF, ~ 6k in IE10 und knapp ~ 2k in Chrome.

Warum ist es so schnell? Ich kann die offensichtlichen Unterschiede zwischen den anderen Loops sehen und wie man schneller ist als ein anderer, aber ich kann mir nichts einfallen lassen, was den absolut überwältigenden Leistungsunterschied mit dieser Schleife erklären würde, 700 Millionen bis 100k ist eine wahnsinnige Lücke / p>

Nach Antworten bearbeiten:

Ausgehend von Michael Garys Antwort ging ich zurück und bearbeitete das Setup so, dass es ein echtes reales Array enthielt und die Ergebnisse fielen in die Realität zurück: Ссылка

    
Enzo 07.04.2013, 03:08
quelle

2 Antworten

7

Der Grund ist einfach. Das Array arr wird mit diesem Code erstellt:

%Vor%

Also hat es eine Länge von 10000, aber alle Elemente sind undefined . Diese Schleife arbeitet nicht mit der Array-Länge, sondern wird beendet, wenn sie einen "falsy" -Wert feststellt - die Annahme ist, dass die Schleife stoppt, wenn v einen undefined -Wert als Ergebnis des Versuches erhält, über das Ende hinaus zu lesen des Arrays.

Aber in diesem speziellen Array haben alle zehntausend Elemente den Wert undefined . Daher stoppt die Schleife, wenn sie das allererste Element des Arrays testet. Mit anderen Worten, es gibt keine Schleife! Kein Wunder, dass es schnell ist.

Aber was ist mit einem realeren Fall? Wie funktioniert diese Art von Schleife mit einem langen JSON-Array von Objekten:

%Vor%

Hier haben Sie nicht das Problem, dass die Schleife sofort beendet wird, da die Array-Elemente alle "truthy" sind.

Mit modernen JavaScript-Engines stellt sich heraus, dass dies ein ziemlich schlechter Weg ist, eine Schleife zu schreiben, wie ich kürzlich zu meiner extremen Verlegenheit herausgefunden habe.

Ich war einer der Autoren des jQuery-Kochbuchs : Ich schrieb den größten Teil von Kapitel 5, "Schneller, Einfacher, mehr Spaß ". Nun, der "schnellere" Teil lief nicht so gut. Ich empfehle eine Schleife, die Ihrer sehr ähnlich ist, um über eine große Anzahl von Objekten wie dem obigen zu iterieren:

%Vor%

Es stellt sich heraus, dass dies in modernen Browsern wesentlich langsamer ist als bei einer herkömmlichen Schleife wie dieser:

%Vor%

Ein Teil davon ist auf die Tatsache zurückzuführen, dass der Versuch, über das Ende des Arrays hinaus zu lesen, einige JavaScript-Engines zurück in eine nicht optimierte Weise zur Darstellung des Arrays bringt, wie mir einer der V8-Autoren bei Google I / O zuletzt erklärt hat Jahr. Ein Teil davon könnte daran liegen, dass die Browser die gängigsten Arten von Schleifen optimieren und diesen weniger gebräuchlichen Ansatz nicht optimieren.

Wie auch immer, die konventionellere Schleife stellt sich in modernen Browsern als schneller heraus:

Ссылка

Aber das ist ein anderer Fall als Ihre Schleife. In Ihrem Fall ist die irrsinnige Leistungssteigerung direkt darauf zurückzuführen, dass die Schleife nicht ausgeführt wird . : -)

    
Michael Geary 07.04.2013, 03:24
quelle
3

arr wird auf ein Array initialisiert, das 10000 Lose enthält. Array(10000) bereitet die Länge des Arrays vor, füllt sie aber nicht auf.

Daher wird arr[0] undefined sein, was falsch ist, also wird die for-Schleife sofort beendet.

Im Wesentlichen läuft der Code herunter:

%Vor%     
Niet the Dark Absol 07.04.2013 03:24
quelle

Tags und Links