视频讲解

文字讲解

如果去测试代码运行的时长,你会选择哪个时间函数? 一般第一时间想到的函数是 Date.now 或 Date.getTime。

1、先讲结论

之所以这么选,是基于 精度 和 时钟同步 两方面考虑的。

2、知识讲解

首先看一下 Date.now 的缺点

返回的时间精度为 毫秒(10^-3)级别,精度不够;

受到系统时间影响,也有可能被其他软件调整所影响

为了获得更高精度、且和系统时间无关的时间,W3C 制定了 High Resolution Time Level 2 标准,其中的 6. Monotonic Clock 章节就规定了标准实现方需要提供 “单调递增” 的全局系统时钟:

在 Node.js 和 浏览器中都实现了该标准,具体的实现就是 performance 对象。我们可以通过 performance.now 获取相对起点的时间戳,具备以下几个特性:

和 JS 中其他可用的时间类函数(比如 Date.now )不同的是,performance.now() 返回的时间使用了一个浮点数来达到 微秒(10^-6) 级别的精确度

时间以一个 恒定的速率 慢慢 增加 的,它不会受到系统时间的影响(不会被其他软件所调整)

从标准定义看,可以存在 clock drift (允许时钟漂移)

这里大致说一下 clock drift 的概念,它是源于 时钟同步 概念。时钟同步(Clock synchronization)是计算机科学与工程学中的一个概念,旨在协调多个独立的时钟。现实中的多个时钟,即使时间已调至一致,但在一段时间后依然会因为时钟漂移(即clock drift)而显示不同的时间,因为它们计时的速率会略有差异。

是否有更精细的时钟存在呢?

有的,在 Node.js 环境中就提供了 process.hrtime 方法:

在 node v0.7.6 版本中新增,兼容性很好(毕竟现在都 v12 LTS 版本了)

精度高达 纳秒(10^-9) 级别

不存在 时钟漂移 (clock drift)

可以说 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);

到这里本节主要内容讲完了,也就自然而然获得本节刚开始的结论。

3、小知识

如果你使用 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);

4、参考文章

MDN - Performance.now:MDN 上 performance.now 的 API 文档

Creating a timestamp:言简意赅的总结,本文的选材最初就是来源于此

Measure process time with Node Js?:SOF 上对该问题的解答,也是用 process.hrtime 进行高精度时间测量

初探 performance – 监控网页与程序性能:window.performance 提供了一组精确的数据,经过简单的计算就能得出一些网页性能数据

页面性能监测之performance:详细介绍如何利用 performance 对象来评测页面性能

关于 “前端Tips专栏”

“前端Tips”专栏,隶属于 JSCON 专栏系列,设计初衷是快速获取前端小技巧知识,取材广泛,涵盖前端编程诸多领域。有两种方式获取历史 tips:

① 在公众号内回“tips” + “年份” + “A(或者B)” 获取半年度 tips。例如:回复 “tips2020A” 即可获取 2020 年上半年 tips 列表

欢迎大家关注我的知识专栏,更多内容等你来挖掘

「可在微信内搜索 “JSCON简时空”或 “iJSCON” 关注」

c语言计时程序 纳秒,前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度相关推荐

  1. linux ps le hrtime,前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度

    视频讲解 文字讲解 如果去测试代码运行的时长,你会选择哪个时间函数? 一般第一时间想到的函数是 Date.now 或 Date.getTime. 1.先讲结论 之所以这么选,是基于 精度 和 时钟同步 ...

  2. c语言单片机计时程序,C51单片机秒表计时(C语言)

    <C51单片机秒表计时(C语言)>由会员分享,可在线阅读,更多相关<C51单片机秒表计时(C语言)(4页珍藏版)>请在人人文库网上搜索. 1.南开大学滨海学院C51嵌入式软件设 ...

  3. 好程序员web前端分享如何理解JS单线程

    好程序员web前端分享如何理解JS单线程,JS本质是单线程的.也就是说,它并不能像JAVA语言那样,两个线程并发执行. 但我们平时看到的JS,分明是可以同时运作很多任务的,这又是怎么回事呢? 首先,J ...

  4. 好程序员web前端分享JS引擎的执行机制

    好程序员web前端分享JS引擎的执行机制,请先着重牢记两点!JS是单线程语言. JS的EventLoop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的eventloop. 1.灵魂三问: ...

  5. C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)

    C语言/C++程序员大神打造纯C的电子时钟,每天看时间再也不麻烦了 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进 ...

  6. 好程序员web前端干货之web前端开发框架汇总

    好程序员web前端干货之web前端开发框架汇总,其实一个前端开发框架其实就是一系列产品化的HTML/CSS/JavaScript组件的集合,我们可以在设计中使用它们.前端开发框架有很多,其中有一些写得 ...

  7. 好程序员大前端送干货Web前端开发框架汇总

    好程序员大前端送干货Web前端开发框架汇总,其实一个前端开发框架其实就是一系列产品化的HTML/CSS/JavaScript组件的集合,我们可以在设计中使用它们.前端开发框架有很多,其中有一些写得很棒 ...

  8. 好程序员web前端CSS选择符(选择器):表示要定义样式的对象

    好程序员web前端CSS选择符(选择器):表示要定义样式的对象 1) 元素选择符/类型选择符(element选择器 ) 如:div{width:100px; height:100px; backgro ...

  9. 好程序员web前端分享HTML基础篇

    好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基 ...

最新文章

  1. linux java性能监控工具_性能监控工具以及java堆分析OOM
  2. springMVC笔记day01
  3. LOJ6354 洛谷4366:[Code+#4]最短路——题解
  4. Linux 文件系统初探
  5. Opencv中的Laplacian(拉普拉斯算法)
  6. Linux 中/etc/profile、~/.bash_profile 环境变量执行过程
  7. 计组之总线:2、总线仲裁(链式查询、计数器查询、独立请求、分布式查询)
  8. vue 给checkbox 赋值_浅谈vue中关于checkbox数据绑定v-model指令的个人理解
  9. C编程语言中16位整型数据的取值范围介绍
  10. 基于Binder机制之AIDL原理分析
  11. Android 正则表达式
  12. 专转本-矩阵的初等变换与线性方程组
  13. 如何选择计算机硬件,如何选择计算机硬件?盲目选择硬件只会导致您的计算机被提前淘汰!...
  14. Docker网络之三:自定义容器虚拟IP
  15. 培训班出来的程序员怎么就不行了?
  16. qq图的理解以及python的实现
  17. 微信跑腿小程序怎么做
  18. 【大众点评评论爬虫】一键获取大众点评完整评论工具批量爬取保存为excel数据
  19. 可以储存照片的字段类型是_在数据库中可用来存储图片的字段对象是哪种类型的字段?...
  20. w10计算机管理员权限在哪里设置密码,windows10管理员权限怎么设置_win10电脑设置管理员权限的步骤...

热门文章

  1. csharp基础练习题:TIY-Fijhghbujhjh【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  2. Supcon UDP协议使用的端口号是多少?
  3. Android之关机/重启/recovery模式(一百一十五)
  4. 数据网络卡顿怎么处理_手机流量卡顿怎么办
  5. Blender技巧之Eevee渲染设置中常见问题及解答
  6. 阴影:盒子阴影(box-shadow)和文字阴影(text-shadow)
  7. 华为手机应用改名_华为怎么给app改名字
  8. 敏捷革命:提升个人创造力与企业效率的全新协作模式--读书笔记全书
  9. 关于Django的响应式网页
  10. 超频到3200最佳时序_如何榨取更多CPU性能:CPU BIOS超频简单教程