2015-01-22 5 views
5

각 루프에 대해 몇 가지 개선점을 살펴보고이를 사용하는 여러 가지 방법을 비교하는 테스트 벤치 마크를 만들었습니다. 테스트는 found here 일 수 있습니다. Javascript foreach 루프 성능

는이 코드 것을 찾을 수 놀랐습니다 :

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

이보다 더 나은 수행합니다.

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

정확히 일치하지 않습니까? 첫 번째 코드 조각을 두 번째 코드 조각보다 빠르게 만드는 것은 무엇입니까?

+0

모두 빠르다 내 PC에. .055와 .053 초에 56 번 –

+1

함수 선언이 함수 표현식보다 일반적으로 빠르기 때문에 그것은 다음과 같습니다 : http://jsperf.com/function-declaration-vs-function-expression. –

+0

@AaditMShah 아주 재미 있어요! – Jonathan

답변

6

테스트에 문제가 있습니다. 당신의 검사 결과는 다음과 같습니다

values.forEach(add); 

와 두 번째 테스트에서

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

, 당신은 함수의 생성뿐만 아니라 forEach의 실행 타이밍 있습니다. 첫 번째 테스트에서는 함수를 생성하는 시점을 정하지 않습니다. 이는 테스트의 설정 단계에서 완료되었지만 시간이 걸리지 않았습니다.

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

대 성능의 차이가 일부에서 (선언이 느리게되는) 다른 방법을 몇 가지 엔진에 사라지고, 이동하는

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

... :

Davin Tryona test that creates the functions in both cases를 생성 . (후자는 엔진이이 함수를 인라인, 또는 적어도 그것이 선언으로 건너 뛸 수없는 몇 가지 단계를 건너 뛸 수있는 테스트 중에 파악하는 것이 아마도.)

enter image description here

+2

테스트의 포크는 다음과 같습니다. http://jsperf.com/for-vs-foreach/271 –

+0

그래도 미리 함수를 선언하는 것이 빠릅니다. – Jonathan

+0

@Jonathan : 왜 그렇게 생각하니? 함수를 반복적으로 작성하는 것이 아니라 한 번만 작성하면 선언 대 표현식은 모듈러 인라인에 관계가 없습니다 (답변에 추가 된 Davin의 업데이트 결과 참조). –