performance.now() 返回以毫秒为单位的浮点数,精度达微秒级,基于 navigationstart 单调递增,不受系统时钟影响,适用于高精度性能测量。

Performance.now() 返回的是什么单位的时间值
Performance.now() 返回的是一个以毫秒为单位的浮点数,但精度远高于 Date.now() —— 它能精确到微秒级(通常 1–5 微秒),且是相对于 performance.timing.navigationStart 的单调递增时间,不受系统时钟调整影响。
关键点:它不是 Unix 时间戳,不能直接和 Date 对齐;它的值可能为小数(如 12345.6789),小数部分代表亚毫秒偏移。
- 典型返回值:
123456.789012表示从页面导航开始后约 123.456789012 秒 - 两次调用差值即为真实经过的高精度时间(单位:毫秒),可直接用于性能测量
- 在 Web Worker 中也可用,但注意主页面与 Worker 的
navigationStart基准不同
为什么不能用 Date.now() 替代 Performance.now()
Date.now() 只保证毫秒级精度,且受系统时钟跳变(NTP 同步、手动校时)影响,可能出现负差值或突变。而 Performance.now() 基于底层高精度定时器(如 QueryPerformanceCounter on Windows 或 mach_absolute_time on macOS),是单调、稳定、高分辨率的。
- 实测中
Date.now()连续两次调用常返回相同整数值(如都为1712345678),无法区分亚毫秒操作 -
Performance.now()在现代浏览器中普遍支持(Chrome 24+、Firefox 15+、Safari 8+、Edge 12+),无需 polyfill - 注意:Node.js 默认不提供
performance.now(),需启用--experimental-performance-hooks或使用process.hrtime.bigint()
如何正确测量一段同步代码的执行耗时
最常见错误是把 performance.now() 调用放在异步回调里,或忽略调用开销本身 —— 实际上,performance.now() 调用本身约耗时 0.1–0.5 微秒,对亚毫秒测量影响极小,但逻辑必须紧包目标代码。
const start = performance.now();
doHeavyCalc(); // 同步执行
const end = performance.now();
console.log(`耗时:${(end - start).toFixed(3)} ms`); // 如 "0.234 ms"
- 务必确保
doHeavyCalc()是同步函数;若含 Promise 或 setTimeout,需改用performance.mark()+performance.measure() - 单次测量易受 CPU 预热、JIT 编译等干扰,建议循环多次取中位数或最小值
- 避免在测量期间触发强制同步布局(如读取
offsetHeight),否则会引入不可控延迟
跨上下文或长周期测量时的注意事项
performance.now() 的基准点(navigationStart)在页面加载时固定,但若页面经历卸载重载、iframe 切换或 Service Worker 控制,各上下文的基准不一致。长期运行(如 >24 小时)也不推荐直接用原始值做比较,因为浮点数精度会随数值增大而下降(IEEE 754 double 在 ~2⁵³ 后无法精确表示整数毫秒)。
- iframe 中的
performance.now()基准是其自身 navigationStart,与父页面无关 - SPA 路由切换不重置
navigationStart,所以整个 SPA 生命周期内performance.now()仍连续可用 - 如需跨页面持久化时间参考,应记录相对差值,或改用
performance.timeOrigin(返回绝对时间起点,类型为 DOMHighResTimeStamp)
真正难的不是调用 performance.now(),而是理解它和你正在测量的那段代码之间,有没有隐藏的调度、渲染、GC 或 I/O 干扰 —— 那些才是亚毫秒级测量里最常被忽略的变量。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











