for loop vs forCada rendimiento en javascript y credibilidad de los resultados de jsperf
No confío en los resultados de jsperf que mide el rendimiento de for loop vs forEach. Al menos para Chrome y Firefox en mi máquina, los resultados son completamente diferentes a los que se anuncian en jsperf.
http: //jsperf.com/foreach-vs-loo (mía
http: //jsben.ch/#/BQhE (más popular
En mi computadora portátil con Ubuntu 11.10, tengo los siguientes resultados en Firefox:
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. Estoy observando eso para cada 10 veces más rápido que para el bucle en Chrome, y 3 veces más rápido en Firefox.
En Chrome obtengo aproximadamente estos tiempos de ejecución:
for: avg=80 ms
forEach: avg=6 ms
Aquí está el código que ejecuté 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 para un millón de artículos tiene la misma diferencia de rendimiento. ¿Podría decirme si me falta algo y debo confiar en los resultados de jsperf en lugar de los resultados reales que estoy observando? Por supuesto, confío en los resultados reales que puedo ver aquí y ahora en mi navegador.
EDIT: el escenario de prueba no es objetivo como se descubrió durante la discusión con @Blender. Parece que el optimizador js optimiza cada bucle sin ninguna acción y, por lo tanto, oscurece el tiempo de ejecución si hubiera algún código real.