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:
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.
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:
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. int
s, das zusammenhängend im Speicher gespeichert ist; vielleicht ist es ein Array von Zeigern auf allgemeine Objekte. 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.
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.
Tags und Links javascript google-chrome foreach for-loop