如何在 Node.js 中获得最准确的时间戳?
我的 Node.js 版本是0.8.X,而且 节点-微时延长对我不起作用(安装时崩溃)
节点 v10和更高版本 : 您应该使用 process.hrtime.bigint(),它生成一个单独的 BigInt 数字,而不是一个数组。process.hrtime()被标记为“遗产”
process.hrtime.bigint()
process.hrtime()
比节点 v10更老 : 正如沃恩所说,process.hrtime()在 Node.js 中是可用的——它的分辨率是纳秒,因此要高得多。这个函数返回一个数组 [seconds, nanoseconds],其中包含当前的实时高分辨率值,但请注意它是 没有特定的时钟,这意味着两个连续值中的 不同告诉您经过了多长时间,但是单个值没有告诉您任何有意义的信息。
[seconds, nanoseconds]
Other JS environments: new Date().getTime()? This gives you a timestamp in milliseconds. 更新:
new Date().getTime()
Node.js 纳米计时器
我在 process.hrtime函数调用之上为 node.js 编写了一个包装器库/对象。它具有一些有用的功能,比如计时同步和异步任务,以秒、毫秒、微型甚至 nano 为单位进行指定,并且遵循内置的 javascript 定时器的语法以便熟悉。
process.hrtime
计时器对象也是离散的,因此您可以拥有任意数量的计时器,每个计时器都运行自己的 setTimeout或 setInterval进程。
setTimeout
setInterval
这叫 纳米计时器看看这个!
在 Node.js 中,“高分辨率时间”可以通过 process.hrtime获得。它返回一个数组,其中第一个元素以秒为单位,第二个元素以纳秒为单位。
若要获取以微秒为单位的当前时间,请执行以下操作:
var hrTime = process.hrtime() console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)
(感谢 (咒语)指出上述转换中的一个错误。)
在现代浏览器中,具有微秒精度的时间可以用 performance.now表示。
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.now和 process.uptime都是高度不可靠的。
Date.now() - (process.uptime() * 1000)
Date.now()
Date.now
process.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 :
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]; } };
重写以帮助快速理解:
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()方法取代。
BigInt
process.hrtime([time])
process.hrtime()方法的 bigint版本在 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);
博士
取 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呢。
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
记住:
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 以浮点数形式存储值,分数为微秒。
现在唯一的办法就是找第三方。
date +%s%N
注意 : 进程 rtime大约是当前时间的 not,
这些时间是相对于过去任意的时间,而不是相对于一天的时间。 Https://www.geeksforgeeks.org/node-js-process-hrtime-method/