性能:now() 方法
performance.now()
方法返回一个以毫秒为单位的高分辨率时间戳。它表示自 Performance.timeOrigin
(窗口上下文中的导航开始时间或工作线程在 Worker
和 ServiceWorker
上下文中运行的时间)以来的经过时间。
语法
now()
参数
无。
返回值
返回一个以毫秒为单位的 DOMHighResTimeStamp
。
描述
Performance.now
与 Date.now
performance.now
规范变更
performance.now()
方法的语义在高分辨率时间级别 1 和级别 2 之间发生了变化。
变更 | 级别 1 | 级别 2 |
---|---|---|
相对于 | performance.timing.navigationStart |
Performance.timeOrigin |
触发条件 | 文档获取或卸载提示(如果有)。 | 创建浏览上下文(如果没有先前的文档)、卸载提示(如果有)或导航开始(如 HTML 中定义,在获取之前几步)。 |
performance.now()
方法过去相对于 performance.timing.navigationStart
属性(来自导航时序规范)。这已经改变,performance.now()
现在相对于 Performance.timeOrigin
,这避免了在跨网页比较时间戳时出现时钟变化的风险。
// 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()
要确定代码中的特定点以来经过了多少时间,你可以执行类似以下操作
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-Policy
和 Cross-Origin-Embedder-Policy
标头隔离你的网站
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
这些标头确保顶级文档不与跨域文档共享浏览上下文组。COOP 将你的文档进程隔离,潜在攻击者无法访问你的全局对象(即使他们在弹出窗口中打开它),从而阻止了一系列称为 XS-Leaks 的跨域攻击。
规范
规范 |
---|
高分辨率时间 # dom-performance-now |
浏览器兼容性
BCD 表格仅在浏览器中加载