2012-11-21 19 views
5

Nach dem Lesen the recent smashing magazine Artikel zur Optimierung, habe ich einige Tests durchgeführt, um zu sehen, was die effektivste Möglichkeit wäre, ein Element aus der Mitte eines meiner Arrays zu löschen.Array Traversal Magnituden schneller nach dem Entfernen des ersten Elements

Nachdem ich meine eigenen Tests bezüglich des Spleißens eines Wertes aus der Mitte des Arrays vs. Löschen/setzen auf null durchgeführt hatte, stieß ich auf das eher unerwartete Ergebnis, dass das Verbinden des Wertes aus dem Array das Array zu einer Größe schneller zu überqueren.

Weitere Untersuchung führte mich zu this.

Aus irgendeinem Grund hat .shift() den ersten Datensatz aus dem Array 300-mal schneller zu durchlaufen (die größte Leistung in V8 gesehen, aber es scheint für alle Browser gültig zu sein, die ich ausprobiert habe es in).

Ich bezweifle, dass ich das missbrauche, da ich nicht glaube, dass die tatsächliche Traversierung ein Flaschenhals ist, aber weiß jemand, warum dieses Verhalten auftritt?

Edit: Falsche Verwendung von jsPerf war das zugrunde liegende Problem hier, siehe meine Antwort unten.

Antwort

0

Okay, es stellt sich heraus, dass dies tatsächlich ein Missverständnis auf meiner Seite ist, wie jsPerf funktioniert.

Der Setup-Abschnitt des Skripts wird am Anfang jedes Schleifensatzes ausgeführt, anstatt ihn jedes Mal auszuführen, wenn das Skript ausgeführt wird.

Wie gezeigt here die Zahlen tatsächlich herauskommen, wie Sie erwarten würden.

0

Also habe ich versucht, die for-Schleifen von jeder der Funktionen zu entfernen, die Kern-Array-Funktionen mit der for-Schleife selbst zu vergleichen.

http://jsperf.com/spliced-vs-non-spliced/3

Die Benchmarks Größenordnungen skalieren aufgrund dieser einfachen Unterschiede in den inneren Abläufe der einzelnen Funktionen. Durch die Vereinfachung auf das Nötigste können wir die wahren Unterschiede isolieren. Ich bezweifle daher, dass die for-Schleife tatsächlich schneller oder langsamer durchquert - es erscheint nur so wegen der anderen Funktionen im Test.

Trotz der Fehlinterpretation ist es immer noch SEHR hilfreich, zu zeigen, wie die Array-Funktionen funktionieren und wie JavaScript-Entwickler sie anwenden sollten.

+0

Ich glaube nicht, wenn das der Fall wäre, dann sollte dieser Testfall http://jsperf.com/spliced-vs-non-spliced/6 mit beiden von ungefähr der gleichen Geschwindigkeit kommen, mit dem gespleißt sehr sehr wenig schneller, was nicht der Fall zu sein scheint. – Doug

1

Der Leistungstest ist mit unzähligen Fehlern gefüllt.
Am wichtigsten ist es, eine Stichprobenlänge von 1000 zu nehmen. Mit dem heutigen Prozessor wird ein 1000-Items-Array sofort durchlaufen und Sie messen die Zeit, die die erste Array-Methode benötigt (Shift, Slice, ...) als die tatsächliche Array-Traversierung.
So müssen Sie 1) verwenden Sie ein viel längeres Array,
2) tun die Scheibe/shift/... vor den Schleifen, da das nicht was Sie messen möchten. siehe

werden Sie dann, dass es gibt keine magischen, und dass der Array-Traversal nimmt die gleichzeitig für alle Arrays.

Ich begann in http://jsperf.com/spliced-vs-non-spliced/4, für normale/geschnittene (0,0) und shift() Fälle. Unterschiede in der Leistung sind schlechter als Messfehler.

Verwandte Themen