performance.now() 返回相对于页面导航开始的高精度毫秒浮点数,精度达0.1毫秒级,不受系统时钟调整影响;而Date.now()仅毫秒整数且易受NTP干扰。

Performance.now() 返回的是以毫秒为单位的高精度时间戳,但精度可达微秒级(通常为 0.1 毫秒或更高),它不是自 1970 年起的绝对时间,而是相对于 performance.timing.navigationStart(页面导航开始)的相对时间,适合测量小段代码执行耗时。
为什么不用 Date.now()?
Date.now() 只能精确到毫秒,且受系统时钟调整(如 NTP 同步)影响;而 performance.now() 基于单调递增的高精度时钟,不受系统时间跳变干扰,分辨率通常优于 1 毫秒(现代浏览器普遍支持亚毫秒级,例如 Chrome/Edge/Firefox 可达 0.1–1 微秒量级的理论分辨率,实际返回仍为毫秒浮点数)。
基本用法:获取相对高精度时间差
直接调用两次 performance.now(),相减即得微秒级精度的耗时(单位是毫秒,但带小数,可换算为微秒):
const start = performance.now();
doSomething(); // 例如一个循环或函数调用
const end = performance.now();
console.log(`耗时: ${end - start} 毫秒`); // 如 12.345678901234567
console.log(`约 ${Math.round((end - start) * 1000)} 微秒`);
注意事项和常见误区
- 返回值是 浮点数,单位毫秒,不是整数微秒 —— 它的“高精度”体现在小数位(如
123.456789),隐含微秒甚至纳秒级分辨能力,但不直接返回微秒整数。 - 不能用于跨页面或长期计时 —— 它依赖当前
performance上下文,页面刷新后重置;需长期唯一时间戳请仍用Date.now()或performance.timeOrigin配合。 - 在 Web Worker 中同样可用,且独立于主线程时钟。
- 若需绝对时间戳(带日期信息)+ 高精度,可用:
performance.timeOrigin + performance.now()→ 得到相对于 Unix epoch 的高精度毫秒时间(仍为浮点数)。
进阶:获取真正的微秒整数(仅作参考,非标准需求)
浏览器未提供原生微秒整数 API。若硬性需要微秒整数,可将 performance.now() 乘以 1000 后四舍五入:
立即学习“Java免费学习笔记(深入)”;
const microsecondTimestamp = Math.round(performance.now() * 1000); // 示例输出:1712345678901234(单位:微秒)
⚠️ 注意:这仍是近似值,不增加真实精度,仅格式转换;不同浏览器底层时钟源和舍入策略可能略有差异,不建议用于严格一致性校验。


















