2015-01-22 6 views
5

Я смотрю на улучшение некоторых из наших для каждой петли и создал тестовый тест, чтобы сравнить различные способы их использования. Тест может быть found here.Javascript foreach loop performance

я с удивлением обнаружил, что этот код:

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

работает лучше, чем этот.

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

Разве это не то же самое? Что делает первый фрагмент кода быстрее второго?

+0

как быстро на моем компьютере. 56 раз в .055 и .053 сек –

+1

Это потому, что объявления функций обычно быстрее, чем выражения функций: http://jsperf.com/function-declaration-vs-function-expression. –

+0

@AaditMShah Это очень интересно! – Jonathan

ответ

6

Это проблема с вашим тестом. Ваши тесты:

values.forEach(add); 

и

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

Во втором тесте, вы отсчет времени создания функции, а также выполнение forEach. В первом тесте вы не определяете создание функции; это делается на этапе настройки теста, который не синхронизирован.

Davin Tryon создано a test that creates the functions in both cases:

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

против

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

... в которой разница в производительности исчезает на некоторых двигателях, и идет в другую сторону (объявление быть медленнее) на некоторых , (Последнее, вероятно, что двигатель выясняет в ходе испытания, что он может встраивать функцию, или, по крайней мере, пропустить некоторые из шагов, которые он не может пропустить с декларацией.)

enter image description here

+2

Вот вилка теста: http://jsperf.com/for-vs-foreach/271 –

+0

Тем не менее, хорошо заметить, что объявить свои функции заранее быстрее! – Jonathan

+0

@ Джонатан: Почему вы так думаете? При условии, что вы создаете функции только один раз, а не повторно, выражение vs. expression не имеет значения в модульной вставке (см. Результаты обновления Дэвина, добавленного в ответ). –