2012-03-17 14 views
9

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.

+2

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

+0

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]'. –

+0

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

Respuesta

7

He modificado su código para que sea más justo. ¿Puedes mirar esto?

var arr = []; 
 
for (var i = 0; i < 100000; i++) arr[i] = i; 
 

 
var numberOfRuns = 100; 
 

 
function runTest(name, f) { 
 
    var totalTime = 0; 
 
    console.time(name); 
 

 
    for (var r = 0; r < numberOfRuns; r++) { 
 
     f(); 
 
    } 
 

 
    return console.timeEnd(name); 
 
} 
 

 
function testFunction(v) { 
 
    v; 
 
} 
 

 
var forTime = runTest('for', function() { 
 
    for (var j = 0; j < arr.length; j++) { 
 
     testFunction(arr[j]); 
 
    } 
 
}); 
 

 
var forEachTime = runTest('forEach', function() { 
 
    arr.forEach(testFunction); 
 
});

Su prueba no era 100% Número prima crujido, por lo que el punto de referencia se está optimizando injustamente por algunos navegadores.

+0

¡Muchas gracias! –

+5

En tu violín, el ciclo parece ser más rápido. Pero cuando ejecuto el mismo código en la consola de desarrollador, forEach gana cada vez. ¿Por qué estaría sucediendo eso? –

+1

@KushagraGour: No hay pista. Haz una pregunta. – Blender

3

Aquí es una prueba real: http://jsfiddle.net/ssSt5/57/ (ejecutarlo varias veces)

Al parecer son prácticamente los mismos.

Entonces, cuando hay cálculos reales, for vs forEach no importa. Otros factores son una influencia mucho mayor en el rendimiento. Especialmente después de que el tiempo de ejecución haya aplicado optimizaciones.

Cuestiones relacionadas