Node.js에서 마이크로 타임을 얻는 방법은 무엇입니까?


98

Node.js에서 가장 정확한 타임 스탬프를 얻으려면 어떻게해야합니까?

추신 내 Node.js 버전은 0.8.X이고 node-microtime 확장 이 작동하지 않습니다 (설치시 충돌).

답변:


102

new Date().getTime()? 이는 JS가 제공하는 가장 정확한 타임 스탬프 (밀리 초)를 제공합니다.

업데이트 : vaughan이 언급했듯이 process.hrtime()Node.js 내에서 사용할 수 있습니다. 해상도는 나노초이므로 훨씬 더 높기 때문에 더 정확해야한다는 의미는 아닙니다.

추신 : 더 명확하게하기 위해 [초, 나노초] 내에 ​​현재 고해상도 실시간이 포함 process.hrtime()된 튜플 Array을 반환합니다 .


91
Date.now()부디.
jAndy

50
사용process.hrtime()
vaughan 2013-07-13

3
동의해야합니다. 이 대답은 완전히 틀 렸습니다. 정답은 @Meryn Stol의 아래 답변을 참조하십시오.
Justin Warkentin 2014

11
process.hrtime ()이 시간은 과거의 임의 시간에 상대적이며 하루 중 시간과 관련이 없으므로 시계 드리프트의 영향을받지 않습니다. 주요 용도는 간격 사이의 성능을 측정하는 것입니다. 그래서 그것은 현재 시간을 제공하지 않습니다
Alex

9
모든 상위 답변이 잘못되었습니다. process.hrtime()현재 시간을 반환하지 않습니다.

178

Node.js에서 "고해상도 시간"은 process.hrtime. 첫 번째 요소는 초 단위로, 두 번째 요소는 나머지 나노초로 배열을 반환합니다.

현재 시간 (마이크로 초)을 얻으려면 다음을 수행하십시오.

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

( 위 변환에서 오류를 지적 해 주신 itaifrenkel 에게 감사드립니다 .)

최신 브라우저에서 마이크로 초 정밀도의 시간은 performance.now. 문서는 https://developer.mozilla.org/en-US/docs/Web/API/Performance/now 를 참조 하십시오 .

저는 Node.js를 기반으로이 함수를 구현했습니다.이 함수 process.hrtime는 프로그램에서 두 지점 간의 시간 차이를 계산하려는 경우 상대적으로 사용하기가 비교적 어렵습니다. http://npmjs.org/package/performance-now를 참조 하십시오 . 사양에 따라이 함수는 밀리 초 단위로 시간을보고하지만 밀리 초 미만의 정밀도를 가진 부동 소수점입니다.

이 모듈의 버전 2.0에서보고 된 밀리 초는 노드 프로세스가 시작된시기 ( Date.now() - (process.uptime() * 1000))에 상대적 입니다. 와 유사한 타임 스탬프를 원하는 경우 결과에 추가해야합니다 Date.now(). 또한 다시 계산해야합니다 Date.now() - (process.uptime() * 1000). 모두 Date.now하고 process.uptime정확한 측정을 위해 매우 신뢰할 수 있습니다.

마이크로 초 단위로 현재 시간을 얻으려면 다음과 같이 사용할 수 있습니다.

var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)

참고 항목 : JavaScript는 고해상도 타이머를 제공합니까?


27
벤치 마크를 수행하려면 이전 호출의 결과를 전달하여 process.hrtime()diff를 얻을 수 있습니다. 예를 들면 var startTime = process.hrtime();다음 var diff = process.hrtime(startTime);.
Justin Warkentin 2014

5
초를 마이크로 초로 변환 할 때 시간 단위를 확인하십시오. console.log (hrTime [0] * 1000000 + hrTime [1] / 1000)
itaifrenkel

이 오류를 지적 해 주셔서 감사합니다. itaifrenkel! 전환 코드를 수정했습니다.
Myrne Stol 2014

2
require("performance.now")require("performance-now")?
UpTheCreek 2014 년

5
process.hrtime()현재 시간을 반환하지 않습니다.

21
now('milli'); //  120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; //  120335360904333

알려진 now것은 :

const now = (unit) => {

  const hrTime = process.hrtime();

  switch (unit) {

    case 'milli':
      return hrTime[0] * 1000 + hrTime[1] / 1000000;

    case 'micro':
      return hrTime[0] * 1000000 + hrTime[1] / 1000;

    case 'nano':
      return hrTime[0] * 1000000000 + hrTime[1];

    default:
      return now('nano');
  }

};

14
process.hrtime()현재 시간을 반환하지 않습니다.

어떤 OS가 있습니까?
Abdennour TOUMI

12

BigInt데이터 형식은 Node.js를 10.7.0부터 지원됩니다. ( 또한 참조 블로그 포스트 발표 ). 이러한 지원되는 Node.js 버전의 경우이 process.hrtime([time])메서드는 이제 '레거시'로 간주되고 process.hrtime.bigint()메서드 로 대체됩니다 .

.NET Framework에서 현재 고해상도 실시간을 반환 bigint하는 process.hrtime()메서드 의 버전입니다 bigint.

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);

tl; dr

  • Node.js 10.7.0+-사용 process.hrtime.bigint()
  • 그렇지 않으면-사용 process.hrtime()

8

https://github.com/wadey/node-microtime있습니다 .

> var microtime = require('microtime')
> microtime.now()
1297448895297028

OP는이 패키지를 시도했지만 설치할 수 없다고 말했습니다.
Cameron Tacklind 2019 년

@CameronTacklind 아 그들은 실제로했다 – 그들은 그것을 '확장자'라고 불렀다; 내가 이것을 그리워했다. 많은 사람들이 노드에서 마이크로 타임을 수행하는 방법이라는 질문을 통해이 기사에 왔기 때문에 대답은 여전히 ​​유용합니다.
mikemaccana

5

Node.js 나노 타이머

process.hrtime함수 호출 위에 node.js 용 래퍼 라이브러리 / 객체를 작성했습니다 . 초, 밀리 초, 마이크로 또는 나노 단위로 지정된 동기 및 비동기 작업 타이밍과 같은 유용한 기능이 있으며 친숙 할 수 있도록 내장 된 자바 스크립트 타이머 구문을 따릅니다.

Timer 객체는 또한 개별적이므로 각각 자체 setTimeout또는 setInterval프로세스를 실행 하여 원하는만큼 가질 수 있습니다 .

나노 타이머 라고 합니다 . 확인 해봐!


2

보다 정밀도가 Date.now()높지만 float 정밀도의 밀리 초 를 사용하려면 다음을 수행하십시오 .

function getTimeMSFloat() {
    var hrtime = process.hrtime();
    return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}

2
process.hrtime ()은 현재 시간을 반환하지 않습니다
Marc J. Schmidt

네가 옳아. 문서에서 : "이 시간은 과거 임의의 시간과 관련이 있으며 하루 중 시간과 관련이 없으므로 시계 드리프트의 영향을받지 않습니다. 주된 용도는 간격 간의 성능 측정에 사용됩니다." nodejs.org/api/process .html # process_process_hrtime_time
Ross

1

가져 오기 hrtime한 줄에 하나의 숫자로 :

const begin = process.hrtime();
// ... Do the thing you want to measure
const nanoSeconds = process.hrtime(begin).reduce((sec, nano) => sec * 1e9 + nano)

Array.reduce, 단일 인수가 주어지면 배열의 첫 번째 요소를 초기 accumulator값으로 사용합니다. 하나 0는 초기 값으로 사용할 수 있으며 이것도 작동하지만 왜 추가 * 0.


0

Linux에서 마이크로 초 정밀도 타임 스탬프를 반환하는 시스템 gettimeofday () 함수에 바인딩하는 npm 패키지가 있습니다. npm을 검색합니다 gettimeofday. C를 호출하는 것이process.hrtime()


0

빠른 이해를 돕기위한 재 작성 :

const hrtime = process.hrtime();     // [0] is seconds, [1] is nanoseconds

let nanoSeconds = (hrtime[0] * 1e9) + hrtime[1];    // 1 second is 1e9 nano seconds
console.log('nanoSeconds:  ' + nanoSeconds);
//nanoSeconds:  97760957504895

let microSeconds = parseInt(((hrtime[0] * 1e6) + (hrtime[1]) * 1e-3));
console.log('microSeconds: ' + microSeconds);
//microSeconds: 97760957504

let milliSeconds = parseInt(((hrtime[0] * 1e3) + (hrtime[1]) * 1e-6));
console.log('milliSeconds: ' + milliSeconds);
//milliSeconds: 97760957

출처 : https://nodejs.org/api/process.html#process_process_hrtime_time


0

이 솔루션에 대해별로 자랑 스럽지는 않지만 다음 과 같이 마이크로 초 또는 나노초 단위의 타임 스탬프를 가질 수 있습니다 .

const microsecond = () => Number(Date.now() + String(process.hrtime()[1]).slice(3,6))
const nanosecond = () => Number(Date.now() + String(process.hrtime()[1]).slice(3))

// usage
microsecond() // return 1586878008997591
nanosecond()  // return 1586878009000645600

// Benchmark with 100 000 iterations
// Date.now: 7.758ms
// microsecond: 33.382ms
// nanosecond: 31.252ms

알고:

  • 이 솔루션은 node.js와 함께 독점적으로 작동합니다 .
  • 이것은 관한 3 ~ 10 배 느린 것보다Date.now()
  • 이상하게도 매우 정확 해 보이며 hrTime은 정확히 js 타임 스탬프 틱을 따르는 것 같습니다.
  • 로 대체 Date.now()하여 Number(new Date())밀리 초 단위의 타임 스탬프를 얻을 수 있습니다.

편집하다:

여기에는 쉼표로 마이크로 초를 갖는 솔루션이 있지만 숫자 버전은 기본적으로 자바 스크립트에 의해 반올림됩니다. 따라서 매번 동일한 형식을 원하면 문자열 버전을 사용해야합니다.

const microsecondWithCommaString = () => (Date.now() + '.' + String(process.hrtime()[1]).slice(3,7))
const microsecondWithComma = () => Number(Date.now() + '.' + String(process.hrtime()[1]).slice(3,7))

microsecondWithCommaString() // return "1586883629984.8997"
microsecondWithComma() // return 1586883629985.966

0

process.hrtime ()은 현재 ts를 제공하지 않습니다.

작동합니다.

 const loadNs       = process.hrtime(),
        loadMs       = new Date().getTime(),
        diffNs       = process.hrtime(loadNs),
        microSeconds = (loadMs * 1e6) + (diffNs[0] * 1e9) + diffNs[1]

  console.log(microSeconds / 1e3)

-8

보다 나은?

Number(process.hrtime().join(''))

3
이것은 전혀 작동하지 않습니다. 사용하지 마세요. 이 값은 정수이기 때문에 배열의 두 번째 요소는 고정 너비를 갖지 않습니다. 이것이 문자열로 결합되기 위해 선행 0이 없습니다.
user.friendly

Number (process.hrtime (). map ((n, i) => i? ( '000000000'+ n) .slice (-9) : n) .join ( ''))
Mike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.