Node.js에서 고정밀 시간 측정: 최고의 공략
Wenhao Wang
Dev Intern · Leapcell

Node.js 코드의 실행 시간을 테스트하려고 할 때 어떤 타이밍 함수를 선택하시겠습니까? 일반적으로 가장 먼저 떠오르는 옵션은 Date.now
또는 Date.getTime
입니다.
결론부터 말씀드리자면:
Node.js 프로그램에서는 process.hrtime
을 우선시하고 그 다음으로 performance.now
, 마지막으로 Date.now
를 사용하십시오.
이러한 선호도는 정확도 및 클록 동기화를 고려한 것입니다.
설명
Date.now
의 제한 사항
- 반환된 시간의 정확도는 밀리초 수준(10^-3)이며, 이는use case에 따라 충분하지 않습니다.
- 시스템 시간에 영향을 받으며 다른 소프트웨어의 조정에 영향을 받을 수 있습니다.
더 높은 정확도와 시스템 시간으로부터의 독립성을 확보하기 위해 W3C는 High Resolution Time Level 2 표준을 설정했습니다. 6. Monotonic Clock 섹션에서는 표준을 준수하는 구현이 "monotonic" 글로벌 시스템 클록을 제공해야 한다고 명시합니다.
이 표준은 performance
객체를 통해 Node.js와 브라우저 모두에 구현되었습니다. performance.now
를 사용하여 시작점을 기준으로 타임스탬프를 얻을 수 있으며, 다음과 같은 특징이 있습니다.
- JavaScript의 다른 시간 관련 함수(예:
Date.now
)와 달리performance.now()
는 부동 소수점 숫자를 반환하여 마이크로초(10^-6) 정확도를 달성합니다. - 시간은 일정한 속도로 증가하며 시스템 시간 조정(예: 다른 소프트웨어에 의한 변경)에 영향을 받지 않습니다.
- 표준 정의에 따라
performance.now()
는 클록 드리프트를 허용합니다.
클록 드리프트에 대한 간단한 참고 사항
클록 드리프트는 여러 독립적인 클록을 정렬하는 것을 목표로 하는 클록 동기화의 개념에서 발생합니다. 실제로 동기화 후에도 클록은 틱 속도의 약간의 차이로 인해 시간이 지남에 따라 드리프트되어 표시되는 시간이 달라질 수 있습니다.
더 정확한 클록이 있습니까?
예, Node.js에는 process.hrtime
메서드가 있습니다.
- Node.js v0.7.6에 도입되었으며 호환성이 뛰어납니다(현재 버전은 이미 v22 LTS).
- 나노초(10^-9) 정확도를 제공합니다.
- 클록 드리프트에 영향을 받지 않습니다.
process.hrtime
메서드는 시간 간격을 측정하도록 특별히 설계되었습니다.
참고: 브라우저 환경에서는 hrtime
을 지원하지 않으므로 브라우저에서 달성할 수 있는 가장 좋은 정확도는 performance.now
를 통한 마이크로초 수준입니다(브라우저 간 구현에 따라 다름).
그러나 process.hrtime
을 사용하려면 사용법에 주의해야 합니다. 첫 번째 호출은 time
값을 반환하며, 이 값은 후속 호출의 입력 매개변수로 사용해야 합니다.
const NS_PER_SEC = 1e9; const time = process.hrtime(); // 첫 번째 호출, 초기 `time` 변수 반환 // [ 1800216, 25 ] setTimeout(() => { const diff = process.hrtime(time); // 시간 차이를 계산하기 위해 두 번째 호출에 대해 처음 반환된 `time`을 입력으로 사용합니다. // [ 1, 552 ] console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`); // Benchmark took 1000000552 nanoseconds }, 1000);
이것으로 주요 내용이 마무리되고 자연스럽게 이 섹션의 시작 부분에 있는 결론으로 이어집니다.
추가 참고 사항
hrtime.bigint
메서드를 사용할 수도 있습니다. 이것은 process.hrtime
의 BigInt 기반 버전입니다(BigInt 지원은 v10.4에서 도입됨). 현재의 고정밀 실제 시간을 제공합니다.
이 메서드는 추가적인 time
입력 매개변수가 필요하지 않기 때문에 process.hrtime
보다 편리합니다. 두 번의 호출 결과를 빼기만 하면 시간 차이를 계산할 수 있습니다.
const start = process.hrtime.bigint(); // 191051479007711n setTimeout(() => { const end = process.hrtime.bigint(); // 191052633396993n console.log(`Benchmark took ${end - start} nanoseconds`); // Benchmark took 1154389282 nanoseconds }, 1000);
Leapcell은 Node.js 프로젝트를 클라우드에 배포하기 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불하고 요청 횟수에는 무관합니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불합니다.
- 예: $25로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 높은 동시성을 쉽게 처리하기 위한 자동 확장.
- 운영 오버헤드가 없으므로 구축에만 집중하십시오.
설명서에서 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ