2015-01-22 16 views
5

Szukam poprawy niektórych z naszych dla każdej pętli i stworzył test porównawczy, aby porównać różne sposoby ich używamy. Test może być found here.JavaScript pętla foreach wydajność

Byłem zaskoczony, aby dowiedzieć się, że ten kod:

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

działa lepiej niż ten.

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

Czy to nie to samo? Co sprawia, że ​​pierwszy fragment kodu jest szybszy od drugiego?

+0

oba szybkie na moim komputerze. 56 razy w .055 i .053 s –

+1

Wynika to z faktu, że deklaracje funkcji są zwykle szybsze niż wyrażenia funkcji: http://jsperf.com/function-declaration-vs-function-expression. –

+0

@AaditMShah To całkiem interesujące! – Jonathan

Odpowiedz

6

To jest problem z twoją próbą. Twoje testy są:

values.forEach(add); 

i

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

W drugim teście, jesteś rozrządu tworzenie funkcji, jak również wykonanie forEach. W pierwszym teście nie masz czasu na tworzenie funkcji; odbywa się to podczas fazy konfiguracji testu, która nie jest ustalana w czasie.

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

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

vs.

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

... w których różnica w wydajności znika na kilka silników, a idzie w drugą stronę (deklaracja jest wolniejsze) na niektóre . (Ta ostatnia jest prawdopodobnie to, że silnik dane, podczas testu, który może inline funkcję, przynajmniej pominięcie pewnych etapów, które nie mogą przejść z zgłoszenia.)

enter image description here

+2

Oto widelec testu: http://jsperf.com/for-vs-foreach/271 –

+0

Mimo to warto zauważyć, że deklarowanie wcześniejszych funkcji jest szybsze! – Jonathan

+0

@ Jonathan: Co sprawia, że ​​tak myślisz? Pod warunkiem, że tworzysz funkcje tylko raz, a nie wielokrotnie, deklaracja w stosunku do wyrażenia nie ma znaczenia podczas wstawiania modulo (zobacz wyniki z aktualizacji Davina dodanej do odpowiedzi). –