Chrome für die Schleifenoptimierung

8

Also ich war neugierig, was wäre schneller für die Iteration durch ein Array, die normale for loop oder forEach , also habe ich diesen Code in der Konsole ausgeführt:

%Vor%

Jetzt sind die Ergebnisse in Chrome 49 ms für die Schleife for , 376 ms für die Schleife forEach . Was in Ordnung ist, aber die Ergebnisse in Firefox und IE (und Edge) sind sehr unterschiedlich.

In beiden anderen Browsern dauert die erste Schleife ~ 15 Sekunden (ja Sekunden), während die forEach "nur" ~ 4 Sekunden dauert.

Meine Frage ist, kann mir jemand den genauen Grund sagen, warum Chrome so viel schneller ist?

Ich habe alle möglichen Operationen innerhalb der Loops ausprobiert, die Ergebnisse waren immer um eine Meile besser für Chrome.

    
chnging 10.03.2017, 13:11
quelle

2 Antworten

3

Haftungsausschluss: Ich kenne die Besonderheiten von V8 in Chrome oder den Interpreter von Firefox / Edge nicht, aber es gibt einige sehr allgemeine Einsichten. Da V8 Javascript in nativen Code kompiliert, sehen wir, was es möglicherweise tun könnte:

  • Sehr grob: Variablen wie Ihre var i können als sehr allgemeine JavaScript-Variable modelliert werden, so dass sie jede Art von Wert von Zahlen bis zu Objekten annehmen kann (zum Beispiel als Zeiger auf ein struct Variable modelliert), oder Der Compiler kann den tatsächlichen Typ (sagen wir ein int in C ++ zum Beispiel) von Ihrem JS herleiten und es so kompilieren. Letzteres benötigt weniger Speicher, nutzt Caching, verwendet weniger Indirection und kann möglicherweise so schnell wie ein for -loop in C ++ sein. V8 macht das wahrscheinlich.
  • Das obige gilt auch für Ihr Array: vielleicht kompiliert es sich zu einem speichereffizienten Array von int s, das zusammenhängend im Speicher gespeichert ist; vielleicht ist es ein Array von Zeigern auf allgemeine Objekte.
  • Temporäre Variablen können entfernt werden.
  • Die zweite Schleife könnte durch Inlining des Funktionsaufrufs optimiert werden, vielleicht ist dies der Fall, vielleicht nicht.

Der Punkt ist: Alle JS-Interpreter / Compiler können diese Optimierungen potenziell ausnutzen. Dies hängt von vielen Faktoren ab: der Kompromiss zwischen Kompilierungs- und Ausführungszeit, der Art, wie JS geschrieben wird, usw.

V8 scheint viel zu optimieren, Firefox / Edge vielleicht nicht in diesem Beispiel. Zu wissen, warum genau, erfordert ein gründliches Verständnis des Interpreters / Compilers.

    
Harmen 10.03.2017, 14:08
quelle
1

Die For-Schleife ist im Vergleich zu anderen Iteratoren in jedem Browser am besten. Aber beim Vergleich von Browsern ist das die langsamste Iteration von for-Schleifen. Gehen Sie und versuchen Sie jsperf.com für die Optimierung wird meine beste Empfehlung sein. V8-Motor-Implementierung ist der Grund. Nach dem Chrome-Split von Webkit hat es in den ersten Tagen mehr als 10k Codezeile entfernt.

    
Gary 13.03.2017 10:15
quelle