112

如何在 Node.js 中获得最准确的时间戳?

ps 我的 Node.js 版本是 0.8.X,node-microtime 扩展对我不起作用(安装时崩溃)

4

14 回答 14

198

在 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.nowprocess.uptime

要以微秒为单位获取当前时间,您可以使用类似这样的方法。

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

另请参阅:JavaScript 是否提供高分辨率计时器?

于 2013-08-12T22:05:21.707 回答
119

new Date().getTime()? 这会为您提供以毫秒为单位的时间戳,这是 JS 将为您提供的最准确的时间戳。

更新:正如 vaughan 所说,process.hrtime()它在 Node.js 中可用 - 它的分辨率是纳秒级,因此它要高得多。[seconds, nanoseconds]此函数返回一个包含当前实时高分辨率值的数组,但请注意,它与任何特定的时钟无关,这意味着两个连续值的差异告诉您经过了多少时间,但单个值告诉您没有任何意义。

另请注意,从 Node v10 开始,process.hrtime()已被标记为“legacy”,您应该process.hrtime.bigint()改用它,它会产生单个 BigInt 数字而不是数组。

于 2012-07-30T16:34:15.870 回答
25
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':
    default:
      return hrTime[0] * 1000000000 + hrTime[1];
  }
  
};
于 2016-08-12T13:38:40.303 回答
15

BigIntNode.js 10.7.0 开始支持数据类型。(另见博文公告)。对于这些受支持的 Node.js 版本,该process.hrtime([time])方法现在被视为“旧版”,由该process.hrtime.bigint()方法取代。

返回当前高分辨率实时的方法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;博士

  • Node.js 10.7.0+ - 使用process.hrtime.bigint()
  • 否则 - 使用process.hrtime()
于 2019-02-03T22:19:41.457 回答
8

还有https://github.com/wadey/node-microtime

> var microtime = require('microtime')
> microtime.now()
1297448895297028
于 2015-09-29T16:40:27.343 回答
4

Node.js 纳米计时器

process.hrtime我在函数调用之上为 node.js 编写了一个包装库/对象。它具有有用的功能,例如定时同步和异步任务,以秒,毫秒,微甚至纳米指定,并遵循内置javascript计时器的语法以便熟悉。

Timer 对象也是离散的,因此您可以拥有任意数量的对象,每个对象都有自己的setTimeoutsetInterval正在运行的进程。

它被称为纳米计时器。看看这个!

于 2013-08-12T19:23:53.950 回答
2

要使用比 更高的精度Date.now(),但浮点精度以毫秒为单位:

function getTimeMSFloat() {
    var hrtime = process.hrtime();
    return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
于 2015-10-30T11:38:27.587 回答
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.

于 2019-07-11T21:00:30.960 回答
1

我对这个解决方案并不感到骄傲,但您可以通过这种方式获得以微秒或纳秒为单位的时间戳:

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())以毫秒为单位获取时间戳

编辑:

这是一个使用逗号的微秒解决方案,但是,数字版本将由 javascript 本机四舍五入。所以如果你每次都想要相同的格式,你应该使用它的字符串版本。

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
于 2020-04-14T15:29:45.570 回答
1

您还可以使用在 NodeJS 和浏览器中都可以使用的性能 API:

var start = performance.timing ?
    performance.timing.navigationStart :
    performance.timeOrigin;

var time = (performance.now() + start) * 1000;

性能 API 以浮点数存储值,分数为微秒。

于 2021-11-07T08:15:42.933 回答
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

于 2017-11-28T04:56:31.470 回答
-1

有一些 npm 包绑定到系统 gettimeofday() 函数,该函数在 Linux 上返回一个微秒精度的时间戳。搜索 npm gettimeofday。调用 C 比调用 C 更快process.hrtime()

于 2015-09-10T23:22:26.860 回答
-1

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)
于 2020-05-04T04:55:21.603 回答
-10

更好的?

Number(process.hrtime().join(''))
于 2018-02-27T16:34:52.323 回答