En este caso, mi conjetura sería que arrayLike[len++] = el
es una optimización sobre actualArray.push(el)
. Sin embargo, después de hacer un punto de referencia simple (código proporcionado debajo de los resultados), parece que este método es realmente más lento que usar una matriz estándar usando el método push
, así como con la misma técnica de construcción.
resultados (de OS X 10.5.8, FF 3.5.6) *:
push construction: 199ms (fastest)
indexed construction: 209ms
associative construction: 258ms (slowest)
En conclusión, ¿por qué El cierre se utiliza una matriz asociativa en este caso es más allá de mí. Probablemente haya una razón (por ejemplo, esta técnica puede funcionar mejor en Chrome, o de forma menos dudosa, esta técnica puede tener un mejor rendimiento en futuras versiones de motores de JavaScript en general), pero no veo una buena razón en este caso.
* No se proporcionó una media porque los tiempos variaron desde la ejecución de la prueba hasta la ejecución de la prueba, pero siempre dieron como resultado el mismo orden. Si estás interesado, puedes llevarlo a cabo por tu cuenta.
código de referencia:
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");
El tamaño y tipo de value
es insignificante para la prueba como JavaScript utiliza copy-on-write. Se utilizó un gran (1kb) value
con el propósito de convencer a los lectores que no están familiarizados con esta característica de JavaScript.
La capacidad no necesariamente crece con cada inserción. Es una optimización común para aumentar la capacidad en un valor mayor que 1 siempre que se alcance la capacidad de un contenedor. No he visto el código del motor real, pero estaría dispuesto a poner dinero en esa optimización que está presente. En cuanto al tiempo de CPU, mi punto de referencia muestra lo contrario, dado que solo está en FF 3.5.6. –
Usted está por supuesto, correcto, pero no quise (significa que) que la capacidad aumentaría con cada inserción ... –