자바스크립트 시간 측정 performance.now()

시간 측정 시 performance.now() 메소드를 사용해 고정밀 측정 결과를 얻을 수 있습니다.

이 메소드는 밀리초 단위로 현재 시간을 리턴하여 매우 정확한 시간 측정 작업이 가능합니다.

함수 실행 시간 측정 예시

function test() {
  for(let i = 0; i < 1000000000; i++);
}

const start = performance.now();
test();
const timeTaken = performance.now() - start;

console.log(`경과 시간: ${timeTaken}`);
함수 실행 시간 측정

개발자 도구를 통해 위의 코드를 실행하면 이미지와 같은 결과를 확인할 수 있습니다.

위의 예제 코드에서는 실행에 시간이 조금 걸리는 test() 함수를 먼저 작성했습니다.

다음으로 performance.now() 메소드를 통해 start 변수에 코드가 실행된 시간을 저장합니다.

그리고 시간이 조금 걸리는 test() 함수를 실행하고, 함수 실행이 끝나면 그 시점의 시간을 가져와 start 변수에 저장했던 시간과의 차이를 계산합니다.

이 결과를 console.log() 메소드를 사용하여 콘솔에 출력하면 함수의 실행 시간 측정이 완료됩니다.

비동기 작업 시간 측정

function asyncOperation() {
  return new Promise(resolve => {
    setTimeout(() => resolve(), 1000);
  });
}

const start = performance.now();
await asyncOperation();
const end = performance.now();

console.log(`실행 시간: ${end - start}`);
비동기 작업 시간 측정

비동기 작업의 경과시간을 측정하는 방법은 await을 사용한다는 점을 빼면 일반 함수의 시간을 측정하는 것과 동일합니다.

먼저 Promise 객체와 setTimeout() 메소드를 통해 1초의 타이머를 실행하는 async 함수를 만듭니다.

그 후 기준이 될 start 변수에 현재 시간을 저장합니다.

시작 시간을 정했으니 await 키워드를 사용해 비동기 함수의 실행을 기다리게 합니다.

함수의 실행이 끝나면 end 변수에 시간을 저장하고 시작 시간과 끝 시간의 차이를 콘솔에 출력하면 비동기 함수의 실행 시간을 계산할 수 있습니다.

performance.now()의 특징

  • 정밀도: performance.now() 메소드는 브라우저 환경에서 고해상도 타이머를 제공하기 때문에 Date.now() 메소드 보다 훨씬 정밀한 시간을 측정할 수 있습니다.
  • 상대적인 시간: 이 메소드의 리턴 값은 절대적인 timestamp가 아닌 페이지 로드나 스크립트 실행 시작 시점으로부터의 경과 시간입니다.
  • 밀리초 이상의 정밀도: 최대 마이크로초 정밀도의 소수점 숫자를 리턴합니다.

시간 측정 시 주요 장점

  • 정밀한 측정: 성능 분석을 위해 이 메소드를 사용하면 더 세밀한 시간 측정 결과를 얻을 수 있으므로 지연시간 계산이나 성능 최적화를 위해 유용하게 사용할 수 있습니다.
  • 높은 정확도: Date.now() 메소드는 시스템 시간에 의존하기 때문에 정확도가 떨어질 수 있지만 performance.now() 메소드는 타이머를 활용해 매우 정확한 시간 정보를 제공합니다.

유의 사항

이 메소드의 리턴 값은 페이지가 새로고침되면 초기화되며, 페이지의 로딩 시간을 기준으로 상대적인 값을 리턴합니다.

브라우저마다 구현이 조금 다를 수는 있지만 대부분의 모던 브라우저에서는 매우 높은 정밀도의 타이머를 제공합니다.

관련 글

자바스크립트 튜토리얼