In diesem Fall würde ich vermuten, dass arrayLike[len++] = el
eine Optimierung über actualArray.push(el)
ist. Nach einem einfachen Benchmark (der Code ist unten aufgeführt) scheint es jedoch so zu sein, dass diese Methode langsamer ist als die Verwendung eines Standard-Arrays unter Verwendung der push
-Methode sowie mit derselben Konstruktionstechnik.
Ergebnisse (ab OS X 10.5.8, FF 3.5.6) *:
push construction: 199ms (fastest)
indexed construction: 209ms
associative construction: 258ms (slowest)
Abschließend warum Closure ein assoziatives Array ist in diesem Fall verwendet, ist mir schleierhaft. Möglicherweise gibt es einen Grund (zum Beispiel, dass diese Technik in Chrome besser abschneidet, oder weniger fragwürdig, diese Technik kann in zukünftigen Versionen von JavaScript-Engines im Allgemeinen besser funktionieren), aber ich sehe in diesem Fall keinen guten Grund.
* Ein Mittelwert wurde nicht angegeben, da die Zeiten von Testlauf zu Testlauf variierten, aber in der gleichen Reihenfolge übereinstimmten. Wenn Sie interessiert sind, können Sie es selbst durchführen.
Benchmark-Code:
var MAX = 100000, i = 0,
a1 = {}, a2 = [], a3 = [],
value = "";
for (i=0; i<1024; ++i) {
value += "a";
}
console.time("associative construction");
for (i=0; i<MAX; ++i) {
a1[i] = value;
}
a1.length = i;
console.timeEnd("associative construction");
console.time("push construction");
for (i=0; i<MAX; ++i) {
a2.push(value);
}
console.timeEnd("push construction");
console.time("indexed construction");
for (i=0; i<MAX; ++i) {
a3[i] = value;
}
console.timeEnd("indexed construction");
Die Größe und Art der value
ist unbedeutend auf die Probe als JavaScript copy-on-write verwendet. Ein großer (1kb) value
wurde verwendet, um diejenigen Leser zu überzeugen, die nicht mit dieser Eigenschaft von JavaScript vertraut sind.
Die Kapazität wächst nicht notwendigerweise mit jedem Einsatz. Es ist eine allgemeine Optimierung, die Kapazität um einen Wert größer als 1 zu erhöhen, wenn die Kapazität eines Containers erreicht wird. Ich habe nicht den Code des tatsächlichen Motors angeschaut, aber ich wäre bereit, Geld dafür zu geben, dass diese Optimierung vorhanden ist. Was CPU-Zeit angeht, zeigt meine Benchmark das Gegenteil, vorausgesetzt, dass es nur in FF 3.5.6 ist. –
Sie haben natürlich Recht, aber ich wollte nicht, dass die Kapazität mit jeder Insertion steigt ... –