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 提供。