如何在Node.js中获得最准确的时间戳?
ps我的Node.js版本是0.8.X,node-microtime扩展名对我不起作用(安装时崩溃)
如何在Node.js中获得最准确的时间戳?
ps我的Node.js版本是0.8.X,node-microtime扩展名对我不起作用(安装时崩溃)
Answers:
new Date().getTime()
?这给您一个以毫秒为单位的时间戳,这是JS给您的最准确的时间戳。
更新:正如vaughan所述,process.hrtime()
它可以在Node.js中使用-它的分辨率为纳秒,因此它的分辨率更高,这并不意味着它必须更精确。
PS .:为了更清楚一点,process.hrtime()
返回一个元组,Array
其中包含当前的高分辨率实时(以秒为单位,以纳秒为单位)
process.hrtime()
在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)
process.hrtime()
以获取差异。例如var startTime = process.hrtime();
然后var diff = process.hrtime(startTime);
。
require("performance.now")
应该require("performance-now")
吗?
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');
}
};
BigInt
从Node.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; dr
process.hrtime.bigint()
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;
}
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
。
重写以帮助快速理解:
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
我对此解决方案并不感到骄傲,但是您可以通过以下方式将时间戳记为微秒或纳秒:
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()
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
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)
更好?
Number(process.hrtime().join(''))
Date.now()
请。