如何在Node.js中获得microtime?

时间:2012-07-30 16:32:24

标签: javascript node.js v8

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

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

11 个答案:

答案 0 :(得分:156)

在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

我已经基于process.hrtime为Node.js实现了这个函数,如果您只想计算程序中两点之间的时间差,则相对难以使用。见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)

另请参阅:Does JavaScript provide a high resolution timer?

答案 1 :(得分:78)

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

更新:正如vaughan所述,process.hrtime()在Node.js中可用 - 它的分辨率是纳秒,因此它的分辨率要高得多,这并不意味着它必须更精确。

PS:为了更清楚,process.hrtime()会返回一个包含当前高分辨率实时的元组Array [秒,纳秒]

答案 2 :(得分:14)

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

};

答案 3 :(得分:6)

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

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

答案 4 :(得分:5)

Node.js nanotimer

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

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

它被称为nanotimer。看看吧!

答案 5 :(得分:3)

从Node.js 10.7.0开始支持BigInt数据类型。 (另请参见blog post announcement )。对于这些受支持的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; dr

  • Node.js 10.7.0+-使用process.hrtime.bigint()
  • 否则-使用process.hrtime()

答案 6 :(得分:2)

使用精度高于Date.now(),但浮点精度为毫秒:

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

答案 7 :(得分:0)

在一行中将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

答案 8 :(得分: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
  • 一起使用
  • 这比Date.now() 3至10倍
  • 奇怪的是,它看起来非常准确,hrTime似乎完全遵循js时间戳记。
  • 您可以将Date.now()替换为Number(new Date()),以获取以毫秒为单位的时间戳记。

编辑:

这里有一个用逗号表示微秒的解决方案,但是,数字版本将由javascript本身取整。因此,如果每次都希望使用相同的格式,则应使用其String版本。

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

答案 9 :(得分: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)

答案 10 :(得分:-5)

更好?

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