In questo caso, la mia ipotesi sarebbe che arrayLike[len++] = el
è un'ottimizzazione su actualArray.push(el)
. Tuttavia, dopo aver eseguito un semplice benchmark (codice fornito sotto i risultati), sembra che questo metodo sia effettivamente più lento rispetto all'utilizzo di un array standard utilizzando il metodo push
e con la stessa tecnica di costruzione.
Risultati (da OS X 10.5.8, FF 3.5.6) *:
push construction: 199ms (fastest)
indexed construction: 209ms
associative construction: 258ms (slowest)
In conclusione, il motivo per cui la chiusura utilizza un array associativo in questo caso è di là di me. Potrebbe esserci un motivo (ad esempio, questa tecnica potrebbe funzionare meglio in Chrome, o meno dubbiosamente, questa tecnica potrebbe funzionare meglio nelle versioni future dei motori JavaScript in generale), ma in questo caso non vedo una buona ragione.
* Non è stata fornita una media perché i tempi variavano dall'esecuzione del test alla corsa di prova, ma consisteva nello stesso ordine. Se sei interessato, puoi portarlo avanti da solo.
Codice di riferimento:
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");
Le dimensioni e il tipo di value
è insignificante alla prova come utilizza JavaScript copy-on-write. Un grande (1kb) value
è stato utilizzato allo scopo di convincere i lettori che non hanno familiarità con questa funzionalità di JavaScript.
fonte
2009-12-28 21:17:46
La capacità non cresce necessariamente con ogni inserto. È un'ottimizzazione comune aumentare la capacità di un valore superiore a 1 ogni volta che viene raggiunta la capacità di un contenitore. Non ho guardato il vero codice del motore, ma sarei disposto a mettere soldi su quell'ottimizzazione presente. Per quanto riguarda il tempo della CPU, il mio benchmark mostra il contrario, ammesso che sia solo in FF 3.5.6. –
Ovviamente, sì, ma non volevo (intendevo) implicare che la capacità aumentasse ad ogni inserimento ... –