Warum sind diese Javascript for Loops in Firefox wesentlich langsamer als in Chrome / Safari?

9

Ich habe mit der Benchmark-Website jfprefs herumgespielt und unter Ссылка .

Die Benchmarks sind Variationen von Javascript for-Schleifen, die Präfix- und Postfix-Inkrementoren verwenden und den Crockford-jslint-Stil, der keinen In-Place-Incrementor verwendet.

%Vor%

Nachdem ich die Zahlen aus einigen Läufen des Benchmarks erhalten habe, ist mir aufgefallen, dass Firefox durchschnittlich 15 Operationen pro Sekunde ausführt und Chrome etwa 300.

Ich dachte, JaegerMonkey und V8 wären in Bezug auf die Geschwindigkeit ziemlich vergleichbar? Sind meine Benchmarks irgendwie fehlerhaft, macht Firefox hier eine Drosselung oder ist die Lücke wirklich so groß zwischen der Leistung der Javascript-Interpreter?

UPDATE: Dank jfriend00 habe ich festgestellt, dass der Unterschied in der Leistung nicht besteht ausschließlich aufgrund der Schleifeniteration, wie in dieser Version des Testfalls zu sehen ist. Wie Sie sehen können, ist Firefox langsamer, aber nicht so stark wie im ersten Testfall.

Also warum ist die Aussage,

%Vor%

So viel langsamer bei Firefox?

    
James McMahon 08.09.2012, 04:12
quelle

2 Antworten

6

Arrays sind in JavaScript schwierig. Die Art und Weise, wie Sie sie erstellen, wie Sie sie füllen (und mit welchen Werten), kann sich auf ihre Leistung auswirken.

Es gibt zwei grundlegende Implementierungen, die von den Engines verwendet werden. Der einfachste und offensichtlichste ist ein zusammenhängender Speicherblock (genau wie ein C-Array mit einigen Metadaten, wie die Länge). Es ist der schnellste Weg, und idealerweise die Implementierung, die Sie in den meisten Fällen wünschen.

Das Problem ist, dass Arrays in JavaScript nur sehr groß werden können, indem sie einem beliebigen Index zugewiesen werden und "Löcher" hinterlassen. Zum Beispiel, wenn Sie ein kleines Array haben:

%Vor%

und Sie weisen einem großen Index einen Wert zu:

%Vor%

Sie werden mit einem Array wie folgt enden:

%Vor%

Um Speicher zu sparen, konvertieren die meisten Laufzeiten array in ein "spärliches" Array. Im Grunde eine Hash-Tabelle, genau wie normale JS-Objekte. Sobald dies geschieht, geht das Lesen oder Schreiben in einen Index von einfacher Zeigerarithmetik zu einem viel komplizierteren Algorithmus, möglicherweise mit dynamischer Speicherzuordnung.

Natürlich verwenden verschiedene Laufzeiten unterschiedliche Heuristiken, um zu entscheiden, wann von einer Implementierung in eine andere konvertiert werden soll. In einigen Fällen kann die Optimierung für Chrome beispielsweise die Leistung in Firefox beeinträchtigen.

In meinem Fall ist meine beste Vermutung, dass das Zurückfüllen des Arrays dazu führt, dass Firefox ein spärliches Array verwendet, das es langsamer macht.

    
Matthew Crumley 08.09.2012, 23:57
quelle
-3

Ich hasse es, Ihnen eine so einfache Antwort zu geben, aber ganz einfach: Verzweigung der Anweisungen: Ссылка

Von dem, was ich vom Benchmark erhalte, ist in diesen Engines etwas unter der Haube, das die Befehlsvorhersagemerkmale der Prozessorhölle gibt.

    
alvonellos 08.09.2012 06:03
quelle