2014-01-10 13 views
6

Ich verstehe recht nicht wesentlich langsamer als ist, warum dieser Test:Warum Push-Methode Werte über Array-Indizes in Javascript setzen

http://jsperf.com/push-method-vs-setting-via-key

Zeigt, dass

a.push(Math.random()); 

mehr als zehn Mal langsamer als

a[i] = Math.random(); 

Können Sie erklären, warum dies der Fall ist ? Was für ein magischer "Schub" macht es so langsam? (oder so langsam im Vergleich zu anderen gültigen Methode, das zu tun).

EDIT

HINWEIS: Der Drucktest vorgespannt ist. Ich vergrößere die Größe des Arrays bei jeder Iteration! Lesen Sie sorgfältig angenommene Antwort!

Benchmark results

+0

Was ist schneller: eine Zuweisung oder ein Funktionsaufruf, der die Länge eines Arrays nachschlägt und eine Zuweisung durchführt? –

+0

Es gibt einen viel kleineren Unterschied zwischen den beiden bei Firefox. –

+0

@ FabrícioMatté Schlagen Sie vor, dass "die Länge nachschlagen" so enorm teuer ist? –

Antwort

8

Könnten Sie erklären, warum dies der Fall ist?

Weil Ihr Test fehlerhaft ist. Das push fügt immer an das vorhandene a Array an, das es viel größer macht, während der zweite Test nur die ersten 1000 Indizes verwendet. Mit setup ist hier nicht genug, müssen Sie das a Array vor jeder for-Schleife zurücksetzen: .

aus, dass abgesehen, haben die Methodenaufruf push könnte ein wenig Overhead, und die aktuelle Feldlänge bestimmen, könnten zusätzliche Zeit benötigen, im Vergleich zu den Index der for-Schleife.

Normalerweise gibt es no reason not to use push - die Methode ist dort für genau diese Operation und macht etwas Code leichter zu lesen. Während einige Leute denken, dass eine Version schneller ist als die andere, sind beide gleichermaßen in Browsern optimiert. Siehe Why is array.push sometimes faster than array[n] = value? und Using the push method or .length when adding to array? - Ergebnisse variieren so weit, dass es eigentlich irrelevant ist. Verwenden Sie, was besser zu verstehen ist.

+0

Machen Sie es viel größer, und dann Speicher zuordnen, die unglaublich teuer ist? –

+0

@Bergi Nicht sicher, aber ich sehe keinen Fehler dort. 'var a = [];' läuft vor jeder getakteten Testschleife. –

+1

@bluesm: Ja, die Speicherzuweisung ist das, was die 'Push'-Version tötet. –

0

Da die .Push() ist ein Funktionsaufruf und der andere ist direkte Zuweisung. Die direkte Zuweisung ist immer schneller.

Denken Sie daran, dass Arrays in JavaScript Objekte wie alles andere sind. Dies bedeutet, dass Sie ihnen Eigenschaften direkt zuweisen können.

Im speziellen Fall von Arrays haben sie eine eingebaute Längeneigenschaft, die hinter den Kulissen aktualisiert wird (und viele andere Optimierungen unter der Haube, aber das ist im Moment nicht wichtig).

In einem normalen Objekt, können Sie dies tun, aber es ist nicht ein Array:

var x = { 
    0: 'a', 
    1: 'b', 
    2: 'c' 
}; 

Da jedoch Arrays und Hashes beiden Objekte sind, diese entspricht.

Da x im zweiten Fall ein Array ist, wird die Länge automatisch berechnet und ist verfügbar.

+0

Sie sind nicht gleichwertig. Im ersten Fall wird der Schlüssel in einen String umgewandelt. Jedes Mal, wenn Sie auf eine Eigenschaft eines Objekts (nicht eines Arrays) zugreifen, wird es in eine Zeichenfolge umgewandelt. –

+0

Sie sind äquivalent, * für einige Definitionen von Gleichheit *. – Agamemnus

2

Das liegt einfach daran, dass Google entschieden hat, mehr Arbeit in die Optimierung der Array-Indizierung zu stecken, als die Methode in Chrome zu optimieren.

Wenn Sie sich die Testergebnisse jetzt ansehen, dass ein paar mehr Leute es ausprobiert haben, sehen Sie, dass die Leistung zwischen verschiedenen Browsern und sogar zwischen verschiedenen Versionen desselben Browsers ziemlich unterschiedlich ist.

Heutzutage kompilieren Browser den Javascript-Code, was bedeutet, dass der Browser den Code in etwas verwandelt, das viel schneller ist, das interpretierte Javascript auszuführen. Was der Compiler mit dem Code macht, bestimmt, wie sich verschiedene Methoden verhalten. Verschiedene Compiler optimieren gewisse Dinge besser, was zu den verschiedenen Preformances führt.

+1

Warum der Downvote? Wenn Sie nicht erklären, was Sie falsch finden, kann es die Antwort nicht verbessern. – Guffa

Verwandte Themen