如何在 Node.js 中获得微时间?

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

我的 Node.js 版本是0.8.X,而且 节点-微时延长对我不起作用(安装时崩溃)

170888 次浏览

节点 v10和更高版本 : 您应该使用 process.hrtime.bigint(),它生成一个单独的 BigInt 数字,而不是一个数组。process.hrtime()被标记为“遗产”

比节点 v10更老 : 正如沃恩所说,process.hrtime()在 Node.js 中是可用的——它的分辨率是纳秒,因此要高得多。这个函数返回一个数组 [seconds, nanoseconds],其中包含当前的实时高分辨率值,但请注意它是 没有特定的时钟,这意味着两个连续值中的 不同告诉您经过了多长时间,但是单个值没有告诉您任何有意义的信息。

Other JS environments: new Date().getTime()? This gives you a timestamp in milliseconds. 更新:

Node.js 纳米计时器

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

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

这叫 纳米计时器看看这个!

在 Node.js 中,“高分辨率时间”可以通过 process.hrtime获得。它返回一个数组,其中第一个元素以秒为单位,第二个元素以纳秒为单位。

若要获取以微秒为单位的当前时间,请执行以下操作:

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

(感谢 (咒语)指出上述转换中的一个错误。)

在现代浏览器中,具有微秒精度的时间可以用 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)

参见: JavaScript 提供高分辨率计时器吗?

有一些 npm 包绑定到 system gettimeofday ()函数, 它返回 Linux 上的一个微秒精度时间戳 调用 C 比调用 process.hrtime()

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

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

以比 Date.now()更精确的方式工作,但以毫秒的浮点精度:

function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
now('milli'); //  120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; //  120335360904333

Known that now is :

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];
}
  

};

重写以帮助快速理解:

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

Source: https://nodejs.org/api/process.html#process_process_hrtime_time

好点了吗?

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

从 Node.js 10.7.0开始就支持 BigInt数据类型。(另请参阅 < a href = “ https://v8.dev/blog/bigint”rel = “ norefrer”> blog post /a > ).对于这些受支持的 Node.js 版本,process.hrtime([time])方法现在被视为“遗留”,由 process.hrtime.bigint()方法取代。

process.hrtime()方法的 bigint版本在 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);

博士

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

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呢。

I'm not so proud about this solution but you can have 以微秒或纳秒为单位的时间戳 in this way:

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()
  • Weirdly, it seems very accurate, hrTime seems to follow exactly js timestamp ticks.
  • 您可以将 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

Hrtime ()不给出当前的 t。

这个应该可以。

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


console.log(microSeconds / 1e3)

您还可以使用同时适用于 NodeJS 和 Browser 的性能 API:

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


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

PerformanceAPI 以浮点数形式存储值,分数为微秒。

现在唯一的办法就是找第三方。

  1. 一个用 C 语言编写函数的库(不管是什么语言,关键是操作系统调用)。编写您自己的或使用例如 https://www.npmjs.com/package/microtime(srchttps://github.com/wadey/node-microtime/blob/master/src/microtime.cc)
  2. 使用 date +%s%N产生一个进程,可以开箱即用地在 Linux 上工作。通过使用 request (‘ child _ process’)可以实现。执行官。由于这个解决方案的性能,我不知道时间会有多精确

注意 : 进程 rtime大约是当前时间的 not,

这些时间是相对于过去任意的时间,而不是相对于一天的时间。 Https://www.geeksforgeeks.org/node-js-process-hrtime-method/