2015-01-22 18 views
5

Sto cercando di migliorare alcuni dei nostri per ogni loop e creato un benchmark di test per confrontare diversi modi in cui li stiamo utilizzando. Il test può essere found here.Javascript foreach performance del ciclo

sono stato sorpreso di scoprire che questo codice:

function add(val) { 
    sum += val; 
} 
values.forEach(add); 

esegue meglio di questo.

values.forEach(function(val) { 
    sum += val; 
    }); 

Non sono esattamente uguali? Cosa rende il primo frammento di codice più veloce del secondo?

+0

entrambi sono veloci sul mio pc. 56 volte in .055 e .053 secs –

+1

È perché le dichiarazioni di funzione sono in genere più veloci delle espressioni di funzione: http://jsperf.com/function-declaration-vs-function-expression. –

+0

@AaditMShah È piuttosto interessante! – Jonathan

risposta

6

È un problema con il test. I test sono:

values.forEach(add); 

e

values.forEach(function(val) { 
    sum += val; 
}); 

Nella seconda prova, il gioco è temporizzazione la creazione della funzione così come l'esecuzione del forEach. Nel primo test, non stai cronometrando la creazione della funzione; questo è fatto durante la fase di setup del test, che non è a tempo.

Davin Tryon creato a test that creates the functions in both cases:

function add(val) { 
sum += val; 
} 
values.forEach(add); 

vs.

values.forEach(function(val) { 
    sum += val; 
}); 

... in cui la differenza di prestazioni scompare su alcuni motori, e va nella direzione opposta (dichiarazione di essere più lento) su alcuni . (Quest'ultimo è probabilmente che il motore capisce durante la prova che può inline la funzione, o almeno saltare alcuni dei passaggi che non può ignorare con una dichiarazione.)

enter image description here

+2

Ecco un fork del test: http://jsperf.com/for-vs-foreach/271 –

+0

Tuttavia, è bene notare che dichiarare le proprie funzioni in anticipo è più veloce! – Jonathan

+0

@ Jonathan: cosa ti fa pensare? A patto che crei le funzioni una sola volta piuttosto che ripetutamente, la dichiarazione rispetto all'espressione non importa l'inlining del modulo (vedi i risultati dell'aggiornamento di Davin che ho aggiunto alla risposta). –