2009-11-30 10 views
2

일부 JavaScript 프로그램의 속도 테스트는 Date 객체를 만들고 함수의 실제 작업 전후의 시간을 밀리 초 단위로 가져 오는 방법으로 수행합니다. 시체를 루프에 추가하는 간단한 방법을 만들었고 마지막으로 새 ms에서 이전 ms를 뺀 다음 인쇄합니다. 그러나 모든 것은 0 밀리 세컨드로 끝납니다. 필자가 쓰기로 확인하는 시간이 작업 전후에 동일하기 때문에 의미가 있습니다. 내가 제대로하고 있으며 자바 스크립트 (Chrome에서)가 번개처럼 빠르게 진행되고 있거나 내 변수를 엉망으로 만든 장면 뒤에 있습니다.JavaScript의 타이밍

+0

, 그것은 그렇지 않으면 잘못 무슨 말을하는 것은 불가능하다 - 무슨 일을하는 것은 원칙적으로 – laura

+0

그것의 올바른 보인다 참조하고있는 코드를 실제로 게시하는 경우 잘못된 작업을 수행하면 쉽게 볼 수 있습니다. – stpe

답변

5

Date 객체가 밀리 초 단위로 시간을 반환하지만 실제로는 그 뒤에있는 타이머의 해상도가 아닙니다. 예를 들어, 타이머는 매 10ms마다 한 번 틱 할 수 있습니다. 프로세스에 3ms 밖에 걸리지 않으면 대부분의 시간 동안 0이 아닌 측정치가 표시되지 않습니다 (때로는 10ms가 표시됩니다).

해결책은 여러 번 기능을 실행하고 전체 시간을 정하는 것입니다. 예를 들어 백만 번 실행하고 총 시간을 1000000으로 나눠 평균 실행 시간을 구하십시오.

1

정말 코드를 볼 필요가 있습니다. 루프가 비동기 적으로 실행되고 있다는 이유는 인터프리터가 다음 명령을 건너 뛰기 전에 루프의 끝까지 기다리지 않기 때문입니다. 물론 루프가 번개처럼 빠르다.

자세히 알아 보려면 JavaScript 프로파일 러를 사용하는 것이 좋습니다. Firefox 용 Firebug에는 좋은 내용이 있습니다. 콘솔을 열고 프로필을 누르기 만하면됩니다.

+0

파이어 버그는 좋은 조언입니다. +1 –

2

일부 간단한 벤치 마크 비교를 구현하는 방법은 answer to this question을 참조하십시오. @Greg Hewgill이 지적했듯이 특정 테스트가 실제로 테스트하는 기간을 정확하게 표시하려면 테스트를 여러 번 실행하는 것이 중요합니다.

일반적으로

, 그것은 같은 간단한 귀결 : 당신은 아마 몇 가지 코드를 게시해야합니다

var MAX = 100000, i = 0, 
    s = null, e = null; 

console.info("`someMethodToTest()` over %d iterations", MAX); 
s = new Date(); 
do { 
    someMethodToTest(); 
} while (++i < MAX); 
e = new Date(); 

console.log("Total: %dms; average: %dms", +e - +s, (+e - +s)/MAX);