Performance: now() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 2015 年 9 月以来,该特性已在各大浏览器中可用。

注意:此功能在 Web Workers 中可用。

performance.now() 方法返回一个高精度毫秒级时间戳。它表示自 Performance.timeOrigin(在窗口上下文中导航开始的时间,或在 WorkerServiceWorker 上下文中 worker 启动的时间)以来经过的时间。

语法

js
now()

参数

无。

返回值

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

描述

Performance.nowDate.now 对比

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

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

performance.now 规范变更

performance.now() 方法的语义在 High Resolution Time Level 1 和 Level 2 之间发生了变化。

变更 Level 1 Level 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();

睡眠期间的计时

规范(Level 2)要求 performance.now() 在操作系统睡眠或浏览器进程以任何方式冻结时应继续计时。似乎只有 Windows 上的浏览器在睡眠期间会继续计时。其他操作系统的相关浏览器 bug

  • Chrome/Chromium (bug)
  • Firefox (bug)
  • Safari/WebKit (bug)

根据您的用例,这种差异可能很重要,也可能不重要。例如,如果您正在计时短时间操作(如加载图像),在此期间系统不太可能睡眠,这可能不会引起任何问题。如果您正在计时长时间操作,您可能会发现 Date.now() 更能避免这些限制,因为 performance.now() 的高精度在这种情况下可能并非至关重要。

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

安全要求

为了防止定时攻击和 指纹识别performance.now() 会根据文档是否 跨域隔离 来进行粗化处理。

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

您可以使用 Window.crossOriginIsolatedWorkerGlobalScope.crossOriginIsolated 属性来检查文档是否跨域隔离。

js
if (crossOriginIsolated) {
  // Use measureUserAgentSpecificMemory
}

示例

使用 performance.now()

要确定代码中的特定点以来经过了多少时间,您可以这样做:

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

规范

规范
高精度时间
# dom-performance-now

浏览器兼容性

另见