2014-11-26 3 views
0

각 루프 반복에서 배열 조회를 수행하는 것보다 루프에서 읽은 배열을 캐싱 할 때 성능이 향상됩니까?루프 내에서 배열 조회를 캐싱 할 때 성능이 향상 되었습니까?

for (var i = 0; i < HEADER_DATA_KEYS.length; i++) { 
    var headerKey = HEADER_DATA_KEYS[i]; 
    var msgVal = message[headerKey]; 
    doStuff(msgVal); 
} 

대 :

for (var i = 0; i < HEADER_DATA_KEYS.length; i++) { 
    var msgVal = message[HEADER_DATA_KEYS[i]]; 
    doStuff(msgVal); 
} 

편집 : 메모이 제이션의 예, 죄송합니다 잘못 사용. 고맙습니다!

+1

http://jsperf.com을 시도하십시오. 그리고 두 샘플 모두 똑같이 보입니다. –

+4

메모가 표시되지 않습니까? 두 예제 모두 동등합니다 ... 두 번째 예제에서는 변수 선언/할당이 하나 더 적지 만 성능 측면에서는 많이 변경하면 안됩니다. – plalx

+0

이 상황에서 나는이 메모를하지 않을 것입니다. 배열 값을 지역 변수에 할당하는 것뿐입니다. 자바 스크립트 컴파일러에 관한 한이 두 변수의 차이는 없습니다. –

답변

1

용어에 약간의 혼동이있다.

Memoization은 후속 작업을 수행하기 위해 수행하는 작업입니다. 계산 비용이 저렴합니다. 시간/공간 트레이드 오프의 고전적인 예입니다 : 메모 (대개 사전)는 더 많은 공간을 차지하지만 최소 시간 내에 실행됩니다.

지금, 수학적으로 말하면, 자바 스크립트 "배열" 는 개체 (또는 어떤 배열에 저장된다)로 N (음이 아닌 정수)의 함수이다. 그러나 시간과 관련하여 배열은 이미 실행하기에 가장 저렴한 함수입니다. 더욱이 그들은 또한 일반적으로 공간면에서 가장 비쌉니다.

즉, 배열은 이미 "가장 메모가 가능한"가능한 기능입니다.

0

Memoization은 복잡한 계산 결과를 저장하여 다음에 필요할 때 다시 계산하는 것을 방지합니다.

var headerKey = HEADER_DATA_KEYS[i];은 암기와 아무 관련이 없습니다. 단순히 값을 변수에 할당하는 것입니다.

필자는 성능 테스트 케이스를 실행하지 않았지만 변수에 값을 할당 할 때 발생하는 성능 오버 헤드가 너무 적어 정상적인 환경에서는 고려하지 않아도된다고 확신 할 수 있습니다.

편집 :

http://jsperf.com/var-assignation-cost

IE 11: 

With assignation: 276,478,194 op/sec 
Without: 327,503,873 op/sec 
+0

와우, IE는 분명히 사용하지 않는 변수를 최적화하는 것처럼 보이지 않습니다. 이것은 우울합니다. Chrome에서 0.28 %의 차이 (1,065,615,176 OPS 대 1,072,567,957)를 얻었습니다. –

관련 문제