2015-01-05 3 views
4

JavaScript의 함수에서 인수 나 로컬 변수를 사용하는 데 성능 차이가 있는지 확인하기 위해 a jsPerf test을 사용했습니다.Chrome 39 자바 스크립트 성능 이상

Firefox 34에서는 실제로 차이점이 없었습니다. 그러나 Chrome 39에서는 컴파일러가 많은 피해를 입는 것으로 보입니다. 이런 일이 발생하는 이유

사람이 설명 할 수 이러한 결과보기?

답변

4

먼저 로컬 변수와 성능 변수를 비교하려고하는 벤치 마크의 경우 각 경우에이 너무 많습니다. 클로저를 반복해서 할당하면 개체 리터럴에서 개체를 할당 할 수 있습니다. for-in 루프. 이러한 작업은 모두 입니다.은 로컬 변수 액세스보다 비쌉니다. 그들의 비용은 가변적 인 작은 비용으로 액세스하는 모든 것을 포함하고 숨 깁니다.

지금보고있는 예외는 V8이 리터럴을 포함하는 클로저를 만들기위한 빠른 경로가 없기 때문입니다. FastNewClosureStub이 있지만 폐쇄 [1]에 리터럴이없는 경우에만 사용됩니다. 이렇게하면 두 번째에 비해 첫 번째 사례에서 클로저 할당이 더 비쌉니다. 클로저 할당이 벤치 마크에서 다소 우세한 부분이므로이 결과가 점수에 반영됩니다 ( 당 하나의 클로저 할당).

리터럴 생성 [2]을 별도의 함수로 숨기면 예외가 사라집니다. 참고 : 이러한 숨기기가 더 이상 기준을 제시하지 못합니다. 여전히 측정하려는 것을 측정하는 것은 이 아니며이 아닙니다.

벤치 마크에서 변수 액세스의 성능 특성을 전반적으로 파악하려는 것은 일반적으로 최적화되지 않은 (기준선) 컴파일러에서 생성 된 코드 에서조차 가장 빠르고 작은 연산이기 때문에 매우 어렵습니다. 변수가 캡처되지 않고 범위에 with, eval 또는 arguments 개체가없는 가장 일반적인 경우에는 단일 메모리로드로 컴파일되는 인수와 로컬 변수 액세스간에 차이가 없습니다.

[1] https://github.com/v8/v8-git-mirror/blob/9def087efcd844342c35f42628bac4ead49cac81/src/ia32/full-codegen-ia32.cc#L1213-L1218

[2]

+0

동등한 결과가 매우 도움이되었다. 통찰력을 가져 주셔서 감사합니다! –