No confío en los resultados de jsperf midiendo el rendimiento de for loop vs forEach. Al menos para Chrome y Firefox, los resultados de mi máquina son completamente diferentes a los que se anuncian en jsperf.
http://jsperf.com/foreach-vs-loop (el mío)
http://jsben.ch/#/BQhED (más popular)
En mi portátil con Ubuntu 11.10 no tengo los siguientes resultados en Firefox:para bucle vs para cada rendimiento en javascript y credibilidad de jsperf results
for: total=1641 ms, avg=164.1 ms
forEach: total=339 ms, avg=33.9 ms
uname -a:
Linux 3.0.0-16-generiC#29-Ubuntu SMP Tue Feb 14 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Desafortunadamente, Chrome no devuelve el resultado de console.timeEnd () pero los tiempos de ejecución son los mismos y más rápidos en Chrome. Lo estoy viendo por cada vez que es casi 10 veces más rápido que para el bucle en Chrome, y 3 veces más rápido en Firefox.
En Chrome que estoy recibiendo aproximadamente estos tiempos de funcionamiento:
for: avg=80 ms
forEach: avg=6 ms
Aquí está el código me encontré en la consola de Firefox y Chrome.
var arr = [];
for(var i = 0; i < 100000; i++) arr[i]=i;
var numberOfRuns = 10;
function time(name, f){
console.time(name);
f();
return console.timeEnd(name);
}
function runTest(name, f){
var totalTime = 0;
for(var r = 0; r < numberOfRuns; r++)
totalTime += time(name,f);
return totalTime;
}
var forTime = runTest('for', function(){
for(var j = 0; j < arr.length; j++)
arr[j];
});
var forEachTime = runTest('forEach', function(){
arr.forEach(function(v){v;});
});
console.log('for', {total:forTime, avg:forTime/numberOfRuns});
console.log('forEach', {total:forEachTime, avg:forEachTime/numberOfRuns});
La ejecución de las pruebas de un millón de elementos tiene la misma diferencia de rendimiento. ¿Podría por favor avisarme si me falta algo y debería confiar en los resultados de jsperf en lugar de en los reales que estoy observando? Por supuesto que confío en los resultados reales que puedo ver aquí mismo en mi navegador.
EDITAR: El escenario de prueba no es objetivo como se descubrió durante la discusión con @Blender. Parece que el optimizador js optimezes para cada bucle sin acción y por lo tanto oscurece el tiempo de ejecución si hubiera algún código real.
jsPerf realiza pruebas reales. El marco de prueba que utiliza es solo una versión más compleja de la suya. Además, asegúrese de tener en cuenta los diferentes motores JS de los navegadores. – Blender
No es un desarrollador de JavaScript, pero supongo que el intérprete está optimizando 'v;' en nada, pero aún busca el valor de 'arr [j]'. –
El objetivo de jsperf es demostrar las diferencias relativas de rendimiento. Todavía está viendo el mismo rendimiento relativo. ¿Qué estás dudando exactamente? – deceze