性能:now() 方法

performance.now() 方法返回一个以毫秒为单位的高分辨率时间戳。它表示自 Performance.timeOrigin (窗口上下文中的导航开始时间或工作线程在 WorkerServiceWorker 上下文中运行的时间)以来的经过时间。

语法

js
now()

参数

无。

返回值

返回一个以毫秒为单位的 DOMHighResTimeStamp

描述

Performance.nowDate.now

Date.now 不同,performance.now() 返回的时间戳不受限于毫秒级的分辨率。相反,它们以浮点数表示时间,精度可达微秒级。

此外,Date.now() 可能受到系统和用户时钟调整、时钟偏差等的影响,因为它相对于 Unix 纪元 (1970-01-01T00:00:00Z) 并且依赖于系统时钟。另一方面,performance.now() 方法相对于 timeOrigin 属性,timeOrigin 属性是一个 单调时钟:它的当前时间永远不会减少,也不受调整的影响。

performance.now 规范变更

performance.now() 方法的语义在高分辨率时间级别 1 和级别 2 之间发生了变化。

变更 级别 1 级别 2
相对于 performance.timing.navigationStart Performance.timeOrigin
触发条件 文档获取或卸载提示(如果有)。 创建浏览上下文(如果没有先前的文档)、卸载提示(如果有)或导航开始(如 HTML 中定义,在获取之前几步)。

performance.now() 方法过去相对于 performance.timing.navigationStart 属性(来自导航时序规范)。这已经改变,performance.now() 现在相对于 Performance.timeOrigin,这避免了在跨网页比较时间戳时出现时钟变化的风险。

js
// Level 1 (clock change risks)
currentTime = performance.timing.navigationStart + performance.now();

// Level 2 (no clock change risks)
currentTime = performance.timeOrigin + performance.now();

睡眠期间计时

规范 (级别 2) 要求 performance.now() 应该在睡眠期间计时。似乎只有 Windows 上的 Firefox 和 Windows 上的 Chromium 在睡眠期间继续计时。其他操作系统的相关浏览器错误

更多详细信息也可以在规范问题中找到 hr-time#115

示例

使用 performance.now()

要确定代码中的特定点以来经过了多少时间,你可以执行类似以下操作

js
const t0 = performance.now();
doSomething();
const t1 = performance.now();
console.log(`Call to doSomething took ${t1 - t0} milliseconds.`);

安全要求

为了提供针对时序攻击和 指纹识别 的保护,performance.now() 的分辨率会根据网站隔离状态进行粗化。

  • 隔离上下文中的分辨率:5 微秒
  • 非隔离上下文中的分辨率:100 微秒

使用 Cross-Origin-Opener-PolicyCross-Origin-Embedder-Policy 标头隔离你的网站

http
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

这些标头确保顶级文档不与跨域文档共享浏览上下文组。COOP 将你的文档进程隔离,潜在攻击者无法访问你的全局对象(即使他们在弹出窗口中打开它),从而阻止了一系列称为 XS-Leaks 的跨域攻击。

规范

规范
高分辨率时间
# dom-performance-now

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅