本文同步自 JSCON简时空 - 前端Tips 专栏#4,点击阅读
视频地址html
若是去测试代码运行的时长,你会选择哪一个时间函数? 通常第一时间想到的函数是 Date.now
或 Date.getTime
。前端
在 Node.js 程序中,优先选 process.hrtime,其次选 performance.now,最后才会是 Date.nownode
之因此这么选,是基于 精度 和 时钟同步 两方面考虑的。git
首先看一下 Date.now
的缺点github
为了得到更高精度、且和系统时间无关的时间,W3C 制定了 High Resolution Time Level 2 标准,其中的 6. Monotonic Clock 章节就规定了标准实现方须要提供 “单调递增” 的全局系统时钟:编程
在 Node.js 和 浏览器中都实现了该标准,具体的实现就是 performance
对象。咱们能够经过 performance.now 获取相对起点的时间戳,具有如下几个特性:segmentfault
Date.now
)不一样的是,performance.now()
返回的时间使用了一个浮点数来达到 微秒(10^-6) 级别的精确度clock drift
(容许时钟漂移)这里大体说一下clock drift
的概念,它是源于 时钟同步 概念。时钟同步(Clock synchronization
)是计算机科学与工程学中的一个概念,旨在协调多个独立的时钟。现实中的多个时钟,即便时间已调至一致,但在一段时间后依然会由于时钟漂移(即clock drift
)而显示不一样的时间,由于它们计时的速率会略有差别。
是否有更精细的时钟存在呢?api
有的,在 Node.js 环境中就提供了 process.hrtime 方法:浏览器
能够说 process.hrtime
方法是 专为测量时间间隔而打造 的。微信
注:浏览器环境没有这个hrtime
方法,所以浏览器环境所能达到的最高精度也就用performance.now
的微秒级别(固然各个浏览器实现也是有差别)
只不过这个方法使用须要注意一下,首次调用返回的 time
须要做为后面调用的入参:
const NS_PER_SEC = 1e9; const time = process.hrtime(); // 这里第一次调用,返回 time 变量 // [ 1800216, 25 ] setTimeout(() => { const diff = process.hrtime(time); // 用第一次返回的 time 变量做为入参放在第二次调用中,从而获取 diff 时间差值 // [ 1, 552 ] console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`); // Benchmark took 1000000552 nanoseconds }, 1000);
到这里本节主要内容讲完了,也就天然而然得到本节刚开始的结论。
若是你使用 Node.js V10.7.0 以上的版本,还可使用 hrtime.bigint 方法,它是 process.hrtime
的 bigint
版本(bigint
类型从 v10.4 开始支持),返回当前的高精度实际时间。
这方法使用起来比 process.hrtime
更加方便,由于它不用额外的 time
入参,直接经过两次调用结果相减就能得到计算时间差:
const start = process.hrtime.bigint(); // 191051479007711n setTimeout(() => { const end = process.hrtime.bigint(); // 191052633396993n console.log(`基准测试耗时 ${end - start} 纳秒`); // 基准测试耗时 1154389282 纳秒 }, 1000);
“前端Tips”专栏,隶属于 JSCON 专栏系列,设计初衷是快速获取前端小技巧知识,取材普遍,涵盖前端编程诸多领域。有两种方式获取历史 tips:
① 在公众号内回“tips” + “年份” + “A(或者B)” 获取半年度 tips。例如:回复 “tips2020A” 便可获取 2020 年上半年 tips 列表
② 前往网站:https://boycgit.github.io/fe-... ,里面提供了搜索功能
欢迎你们关注个人知识专栏,更多内容等你来挖掘
「可在微信内搜索 “JSCON简时空”或 “iJSCON” 关注」