2014 년 While
이 돌아왔다
논리적으로 생각하십시오.
이거 봐요
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- 최소 2 개의 변수 (인덱스, 길이)를 만들어야합니다
- 색인이 길이보다 작은 지 확인해야합니다.
- 인덱스를 늘려야 함
for
루프는 3 개 개의 매개 변수를 가지고
이제 왜 이것이 더 빠를까요?
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- 하나의 변수
- 수표 없음
- 지수가 감소합니다 (기계는 선호합니다)
while
하나의 매개 변수 만 있음
Chrome 28에서 for 루프가 while보다 빠르다는 것을 알았을 때 나는 완전히 혼란 스러웠습니다. 이것은 일종의 벤이 있어야합니다
"어, 모두가 for 루프를 사용하고 있습니다. 크롬을 개발할 때 이것에 초점을 맞추겠습니다."
그러나 이제 2014 년에 while 루프가 크롬으로 돌아 왔습니다. 2 배 더 빠르며, 다른 / 구형 브라우저에서는 항상 빠릅니다.
최근에 몇 가지 새로운 테스트를했습니다. 실제 환경에서 짧은 코드는 가치가 없으며 jsperf는 실제로 while 루프를 제대로 실행할 수 없습니다. 시간이 걸리는 array.length를 다시 만들어야하기 때문입니다.
jsperf에서 while 루프의 실제 속도를 얻을 수 없습니다.
당신은 당신의 자신의 사용자 정의 함수를 생성하고 확인해야 window.performance.now()
그리고 그래 ... while 루프가 더 빠를 방법은 없습니다.
실제 문제는 실제로 dom 조작 / 렌더링 시간 / 드로잉 시간 또는 호출하고 싶습니다.
예를 들어 좌표와 충돌을 계산 해야하는 캔버스 장면이 있습니다 ... 10-200 MicroSeconds (밀리 초가 아닌) 사이에 수행됩니다. 실제로 모든 것을 렌더링하는 데 몇 밀리 초가 걸립니다. DOM에서와 동일합니다.
그러나
loop
경우에 따라 for 를 사용하는 또 다른 수퍼 퍼포먼스 방법이 있습니다 ... 예 : 배열 복사 / 복제
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
매개 변수 설정을 확인하십시오.
- while 루프와 동일하지만 하나의 변수 만 사용하고 있습니다.
- 인덱스가 0보다 큰지 확인해야합니다.
- 보시다시피,이 접근법은 모든 사람들이 사용하는 표준 for 루프와 다릅니다 .3 번째 매개 변수 내부에서 작업을 수행하고 배열 내부에서 직접 감소합니다.
말했다, 이것은 확인 같은 기계-
나는 그것을 조금 더 짧게 만들고 쓸모없는 것들을 제거하고 같은 스타일을 사용하여 이것을 썼다고 생각했습니다.
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
짧아도 i
한 번 더 사용 하면 모든 속도가 느려집니다. 이전 for
루프와 루프 보다 1/5 느립니다 while
.
참고 : 이 ;
없이 looo의 후 매우 중요하다{}
방금 jsperf가 스크립트를 테스트하는 가장 좋은 방법은 아니라고 말했더라도 .. 여기에 2 개의 루프가 추가되었습니다.
http://jsperf.com/caching-array-length/40
그리고 여기 자바 스크립트의 성능에 대한 또 다른 대답이 있습니다.
https://stackoverflow.com/a/21353032/2450730
이 답변은 자바 스크립트 작성 방법을 보여줍니다. 당신이 그것을 읽을 수 없다면, 당신은 자바 스크립트에 대한 답변을 얻거나 책을 읽습니다 http://www.ecma-international.org/ecma-262/5.1/