如何在Node.js中获取最精确的时间戳?
附言:我的Node.js版本是0.8.X,node-microtime扩展对我来说不起作用(安装时崩溃)。
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)
node v10及以上版本:您应该使用process.hrtime.bigint()
,它会产生一个单一的BigInt数字而不是数组。 process.hrtime()
已被标记为“legacy”。
低于node v10的版本:如vaughan所述,在Node.js中可用process.hrtime()
- 其分辨率为纳秒,因此其更高。此函数返回一个包含当前实时高分辨率值的数组[seconds, nanoseconds]
,但请注意,它未绑定到任何特定的时钟,这意味着两个连续值之间的差异告诉您经过了多长时间,但单个值对您没有任何有意义的信息。
其他JS环境:new Date().getTime()
?这将为您提供毫秒级的时间戳。
更新:
process.hrtime()
不会返回当前时间。 - user2609094now('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];
}
};
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);
简述:
process.hrtime.bigint()
process.hrtime()
var start = performance.timing ?
performance.timing.navigationStart :
performance.timeOrigin;
var time = (performance.now() + start) * 1000;
const start = performance?.timing ?? performance.timeOrigin;
const time = (performance.now() + start) * 1000;
还有一个https://github.com/wadey/node-microtime:
> var microtime = require('microtime')
> microtime.now()
1297448895297028
Node.js nanotimer
我在process.hrtime
函数调用的基础上,为node.js编写了一个包装库/对象。它具有有用的功能,例如对同步和异步任务进行计时,可以指定以秒、毫秒、微秒甚至纳秒为单位,并遵循内置javascript计时器的语法,使其更加熟悉。
计时器对象也是离散的,因此您可以拥有任意数量的计时器对象,每个计时器都有自己运行的setTimeout
或setInterval
进程。
它被称为nanotimer。快来看看吧!
为了比 Date.now()
更精确地工作,但使用浮点精度的毫秒:
function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
现在唯一的方法是调用第三方库。
date +%s%N
生成一个进程,在Linux上可直接使用。可以通过使用require('child_process').exec实现。由于此解决方案的性能,我无法确定时间的准确性。注意:process.hrtime与当前时间无关,
这些时间是相对于过去某个任意时间的,与当天时间无关。 [https://www.geeksforgeeks.org/node-js-process-hrtime-method/]
编辑:
使用 jcubic 或 Alexandr 在下面的答案: https://dev59.com/12gt5IYBdhLWcg3w5xg_#69870775 https://dev59.com/12gt5IYBdhLWcg3w5xg_#72741299
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
请注意:
Date.now()
慢约3到10倍,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
process.hrtime()
的结果传递给它以获取时间差。例如:var startTime = process.hrtime()
,然后执行操作后,使用var diff = process.hrtime(startTime)
来获取时间差。 - Justin Warkentinrequire("performance.now")
应该改为require("performance-now")
,对吗? - UpTheCreekprocess.hrtime()
不返回当前时间。 - user2609094perf_hooks
模块中内置了performance
API的实现。 - janispritzkau