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

article/2025/9/20 23:23:40

视频讲解

文字讲解

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

1、先讲结论

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

2、知识讲解

首先看一下 Date.now 的缺点

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

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

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

0e5e40a21f0dc4ab56c650f8bdcabb69.png

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

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

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

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

e87b77971893557c42f8a540049087c3.png

这里大致说一下 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” 关注」


http://chatgpt.dhexx.cn/article/D1hDQ3wO.shtml

相关文章

纳秒时代

1978年在英特尔公司的历史中是很不平凡的一年。这一年它满10岁了,员工数首次超过1万人。这一年,它卖掉了竞争激烈的电子表(digital watch)业务。最重要的是,在这一年6月,它推出了具有跨时代意义的8086芯片。…

linux内核纳秒精度时间,Linux时钟精度:毫秒?微妙?纳秒?

最近被内核时钟精度弄的很是郁闷。具体情况如下: 扫盲:1秒1000毫秒1000000微妙1000000000纳秒 首先:linux有一个很重要的概念——节拍,它的单位是(次/秒)。2.6内核这个值是1000,系统中用一个HZ的宏表征这个值。同时有全…

java 日期 纳秒_java8 ZonedDateTime 日期精度到纳秒

1秒 10E3毫秒 10E6 微妙 10E9 纳秒 使用java8 Instant 内部实际System.currentTimeMillis() 在模型上 可输出纳秒数据 重点是模型 时间戳转日期 public static ZonedDateTime ofInstant(Instant instant, ZoneId zone) { Objects.requireNonNull(instant, "instant&qu…

第九章:NAT(网络地址转换协议)

文章目录 一、NAT1、NAT介绍①公有网络地址②私有网络地址 2、NAT工作原理3、NAT功能 二、NAT的实现方式1、静态转换(static Translation)实验对比 2、动态转换2.1 ACL(访问控制列表)2.2 配置动态NAT实验效果 3、端口多路复用3.1 …

【NAT网络地址转换(私网公网地址、静态NAT、动态NAT、NAPT、Easy IP、NAT Server)】-20211215、20211216

目录 一、NAT产生背景 1.产生背景 2.私网地址、公网地址​ 私网IP地址,既可以一定上缓解ip的不足,在私网里,ip地址可以随意使用。 公网地址,在需要访问公网时,运用网络地址转换NAT技术,可以实现。 二…

什么是私网,公网?

我们常说的内网和外网,通常是相对于防火墙而言的,在防火墙内部叫做内网,反之就是外网。 在一定程度上外网等同于公网,内网等同于私网。公网地址 公网地址是指在因特网上直接可达的地址,如果你有一个公网地址&#xff0…

NAT——公私网地址转换

NAT—网络地址转换 NAT NAT又称为网络地址转换,用于实现私有网络和公有网络之间的转换 私有和公有网络地址 公有网络地址是指互联网上全球唯一的IP地址 私有网络地址是指内部网络或者主机的IP地址 IANA(互联网数字分配机制)规定将下列的IP地…

公网地址和私网地址问题

服务器映射用于将内网服务器的私网地址映射为公网地址,供Internet用户访问。选择“静态映射”类型可以将每一台服务器映射成一个独立的公网IP地址。“服务器负载均衡”类型可以将多台服务器映射成同一个公网地址,Internet用户在访问这个公网地址时&#…

私网地址与Internet地址

一、A、B、C三类地址 可用地址范围备注A类1.0.0.1-126.255.255.254B类128.1.0.1-191.255.255.254C类192.0.1.1-223.255.255.254D类224.0.0.1-239.255.255.254D类为多播地址 说明: 1. 每一个地址都是用网络位主机位组成的。 2. 全0的和全1的网络位和主机位都要去掉…

计算机网络 网络层 私网地址和公网地址及子网划分

公网地址 公有地址分配和管理由Inter NIC(Internet Network Information Center 因特网信息中心)负责。各级ISP使用的公网地址都需要向Inter NIC提出申请,有Inter NIC统一发放,这样就能确保地址块不冲突。 私网地址(不…

为什么百度查到的ip和ipconfig查到的不一样;详解公网Ip和私网ip;详解网络分类ABC;

IP可以分为Public IP 和 Private IP,出现这种规划的原因在于IPv4所能表示的IP太少而电脑太多以至于不够用,然而只有Public IP才能直接连接上网络,所以对于那些公司,学校,政府机构等场所,就可以集中使用私有的IP进行管理…

挑战华为社招:掌握数据库其实很容易

前言 我的一个朋友,开发四年了,没跳过槽,四年时间也不过是从最开始的10K涨到了15K,经常和我吐槽工资低。去年8月份左右开始了他“骑驴找马”的行动,从各种地方找学习资料、刷面试题。值得庆幸的是,他出去找工作时疫情还不严重,异常顺利的面进了蚂蚁,薪资更是翻了几倍。…

javaspringboot面试,挑战华为社招

前言 redis简单来说 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务…

挑战华为社招:不止面试题,笔记源码统统都有,最强技术实现

前言 说起来开始进行面试是11月倒数第二周,上午9点,我还在去公司的公交上,突然收到蚂蚁的面试电话,其实算不上真正的面试。面试官只是和我聊了下他们在做的事情(主要是做双十一这里大促的稳定性保障,偏中间…

挑战华为社招:字节跳动上千道精选面试题还不刷起来

前言 成为优秀的架构师是大部分初中级工程师的阶段性目标。优秀的架构师往往具备七种核心能力:编程能力、调试能力、编译部署能力、性能优化能力、业务架构能力、在线运维能力、项目管理能力和规划能力。 这几种能力之间的关系大概如下图。编程能力、调试能力和编…

华为社招面试

工作第三年,在某招聘软件上填写简历后接到华为HR面试邀请,面试部门为运营商路由器,网上查看岗位相关要求之后发现与自己十分不匹配,不过机会难得,所以决定抱着学习的态度去参加面试。 2018年3月3号周六前往华为北研所Q…

华为社招技术二面,总结复盘

点击上方“Java基基”,选择“设为星标” 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数…

华为社招三面面经分享,现已拿到offer,定级D4对标17级

一面:(面试均是华为的开发,每轮面试完都有反问你想了解的) 修饰符和可见性抽象类抽象方法synchronized,volatile一些java类型相关的基础知识,比如springbuilder和springbuffer哪个线程安全为什么要使用spr…

华为社招面试(拿到offer)

前段时间华为主动联系我要不要面试,抱着试一下的心态接受了面试邀请,最后顺利拿到了offer,不过最终由于方方面面的原因还是没有去。 本文主要分享下,面试的大致过程。 1. 初步电话技术面试 主要问了下,项目C的后台开…