2014-06-22 2 views
3

내가 Ember.js에서이 조각 보았다루프 앞에 배열의 길이를 정의하는 것이 좋은 습관입니까?

for (var i=0, l=deps.length; i<l; i++) { 
    if (deps[i] === 'exports') { 
     reified.push(exports = {}); 
    } else { 
     reified.push(requireModule(resolve(deps[i]))); 
    } 
    } 

var i=0, l=deps.length; i<l; i++에서 봐 주시기 바랍니다을 deps의 길이는 루프 전에 정의된다. 나는 그들이 왜 단지 var i=0; i<deps.length; i++을 사용하는 대신 그것을해야만하는지 궁금해했다. 어쩌면 이것은 "성능 속임수"라고 생각, 그래서 jsperf에서 테스트를하기로 결정 :

http://jsperf.com/predefined-length-vs-inline-defined-length

결과는 두 번째가 빠르다는 것을 보여줍니다. 그래서 첫 번째 것을 사용한 또 다른 이유가 있어야합니다.

누구든지 아이디어가 있으십니까? 고마워.

+0

차이점이 없다는 것을 알고 있습니까? 하나는 변수를 설정하고 하나는 설정하지 않습니다. 오래된 브라우저는 길이를 저장해야하므로 더 빨리 실행되었습니다. 최신 브라우저는 별 차이가 없습니다. – epascarello

+2

왜냐하면 반복문마다 for 루프의 문장이 조회되기 때문입니다. 따라서 모든 반복에서 구문을 찾는 대신 길이를 캐싱하는 것이 조금 저장됩니다. 그러나 대부분의 경우에는 그 차이가 눈에 띄지 않으므로 대부분 그렇지 않습니다. 정말로 중요합니다. 언급 한 바와 같이 최신 브라우저는 이미 내부적으로이를 최적화합니다. – adeneo

+2

순서가 중요하지 않다면, (var i = deps.length; i--;) ...와 같이 역순으로 반복하는 것이 일반적으로 쉽고 빠르다는 것에주의해야합니다. – adeneo

답변

4

작은 성능 최적화만큼 좋은 방법은 아닙니다. 매우 큰 배열에서는 성능이 크게 향상됩니다. 이 작업을 수행하는 이유는 배열의 NodeList 등 길이 값을 "캐시"하므로 루프의 종료 조건에서 변수에 저장되기 때문에 매번 속성에 다시 액세스 할 필요가 없기 때문입니다 .

모든 코드와 마찬가지로 성능이 다르고 브라우저에 따라 더 빠르거나 느릴 수 있습니다.

0

우리 모두가 길이를 계산하는 것이 더 좋을 것이라고 생각하기 때문에 까다 롭습니다. 그러나 실제로 길이를 계산하는 것은 두 경우 모두 한 번만 발생합니다. 하지만 첫 번째에서는 iterator 'i'외에 하나의 변수를 선언하고 있습니다. 따라서 VM은 루프가 끝날 때까지 임시 공간을 할당해야합니다. 그 이유가 가장 느립니다.

희망이 도움이됩니다.

+0

루프의 _condition_ 부분은 ** 루프 본문을 실행할 때마다 ** 먼저 평가되어야합니다. 그래서 'i

관련 문제