数毫秒还不够 - performance.now

Paul Irish

WebPerf 工作组添加了高分辨率计时器,以便能在 Web 平台中进行比使用 +new Date 和较新版本 Date.now() 的测量。

简单比较一下,以下是您可以得到的各类值:

Date.now()         //  1337376068250
performance.now()  //  20303.427000007

您会发现以上两个值相差很多数量级。performance.now() 是自该特定网页开始加载(具体为 performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) timeStamp)以来的浮点数毫秒值。您可能认为这是自 unix 纪元以来的毫秒数,但 Web 应用很少需要知道从现在到 1970 年之间的距离。此数字始终相对于网页,因为您要将两个或多个测量值进行相互比较。

单调时间

这样做的另一个额外好处是,您可以充分利用时间单调。我们请 WebKit 工程师 Tony Gentilcore 讲解这个问题:

应用场景

在以下几种情况下,您可以使用此高分辨率计时器,而不是获取基本时间戳:

  • 基准化分析
  • 游戏或动画 Runloop 代码
  • 精确计算帧速率
  • 在动画或其他基于时间的序列中的特定时间点提示操作或音频

可用性

Chrome(稳定版)中目前提供高分辨率计时器,格式为 window.performance.webkitNow(),该值通常等于传入 requestAnimationFrame 回调中的新参数值。很快,WebKit 将舍弃其前缀,并且可以通过 performance.now() 使用。特别值得一提的是,由 Microsoft 的 Jatinder Mann 领导的 WebPerfWG 非常快速地取消其功能的前缀.

总的来说,performance.now() 是...

  • 用微秒表示的双精度浮点数
  • 相对于页面的 navigationStart,而不是 UNIX 纪元
  • 系统时间变化时不会出现偏差
  • Chrome 稳定版、Firefox 15 及更高版本和 IE10 提供。