2012-03-17 6 views
9

Non mi fido dei risultati delle prestazioni di misurazione jsperf di for loop vs forEach. Almeno per chrome e firefox sui miei risultati macchina sono completamente diversi da quelli pubblicizzati in jsperf.
http://jsperf.com/foreach-vs-loop (la mia)
http://jsben.ch/#/BQhED (più popolare)
Sul mio portatile con Ubuntu 11.10 ho i seguenti risultati in Firefox:per loop vs forOgni performance in javascript e credibilità dei risultati jsperf

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 

Purtroppo, Chrome non restituisce il risultato di console.timeEnd () ma i tempi di esecuzione sono gli stessi e solo più veloci in Chrome. Sto osservando che forEach quasi 10 volte più veloce di loop in Chrome e 3 volte più veloce in Firefox.
In Chrome che sto ricevendo circa questi tempi di esecuzione:

for: avg=80 ms 
forEach: avg=6 ms 

Ecco il codice mi sono imbattuto in consolle Firefox e 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}); 

L'esecuzione dei test per un milione di articoli ha la stessa differenza di prestazioni. Potresti consigliare se mi manca qualcosa e dovrei fidarmi dei risultati di jsperf invece di quelli reali che sto osservando? Naturalmente mi fido dei risultati reali che riesco a vedere qui proprio ora nel mio browser.

MODIFICA: lo scenario di test non è oggettivo come rilevato durante la discussione con @Blender. Sembra che js optimizer optimezes forEach loop senza alcuna azione e quindi oscura il tempo di esecuzione se ci fosse del codice reale.

+2

jsPerf esegue test reali. Il framework di test che usa è solo una versione più complessa della tua. Inoltre, assicurati di tenere conto dei diversi motori JS dei browser. – Blender

+0

Non uno sviluppatore javascript, ma suppongo che l'interprete stia ottimizzando 'v;' a zero, ma continua a cercare il valore di arr [j] '. –

+0

Il punto di jsperf è di mostrare le differenze relative alle prestazioni. Stai ancora vedendo lo stesso rendimento relativo. Che cosa stai dubitando? – deceze

risposta

7

Ho modificato il codice per essere più giusto. Puoi dare un'occhiata a questo?

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); 
 
});

Il test non era al 100% il numero grezzo scricchiolio, in modo che il punto di riferimento è stata ottimizzata ingiustamente da alcuni browser.

+0

Grazie mille! –

+5

Nel tuo violino, per loop sembra essere più veloce. Ma quando eseguo lo stesso codice nella console degli sviluppatori, forEach vince sempre. Perché dovrebbe succedere? –

+1

@KushagraGour: nessun indizio. Fai una domanda. – Blender

3

Qui è un vero banco di prova: http://jsfiddle.net/ssSt5/57/ (eseguirlo più volte)

A quanto pare sono praticamente la stessa.

Quindi, quando è attivo il calcolo reale, lo for vs forEach non ha importanza. Altri fattori influenzano molto le prestazioni. Specialmente dopo che il tempo di esecuzione ha applicato le ottimizzazioni.