performance.now() 对比 Date.now()

performance.now() vs Date.now()

performance.now()Date.now()有什么区别?

我是否应该考虑 performance.now() 来替代 Date.now(),因为 performace.now() 更加一致和独立?

它们都有不同的用途。

performance.now() 相对于页面加载,数量级更精确。用例包括基准测试和其他需要高分辨率时间的情况,例如媒体(游戏、音频、视频等)

需要注意的是performance.now()只适用于较新的浏览器(包括IE10+)。

Date.now() 相对于 Unix 纪元 (1970-01-01T00:00:00Z) 并依赖于系统时钟。用例包括自 JavaScript.

开始以来的相同旧日期操作

有关详细信息,请参阅 When milliseconds are not enough: performance.now and now method (Internet Explorer) - MSDN

可在此处找到官方 W3C 规范:High Resolution Time API

Date.now() returns 自 1970 年 1 月 1 日以来经过的毫秒数 00:00:00 UTC,performance.now() returns 毫秒数,微秒在小数部分,从 performance.timing.navigationStart,文档导航的开始,到 performance.now() 调用。 Date.now()performance.now() 之间的另一个重要区别是后者是单调递增的,因此两次调用之间的差异永远不会为负。

为了更好地理解,请访问 link

我注意到的第一件事是 performance.now()Date.now()4 倍(400k 操作对我的计算机上的 100k)。但是,如果您只是计算,使用 performance.now() 是更好的选择。它完全取决于自代码开始以来的时间 运行,并且时钟更改 不会 影响时间。它也更准确:计算我们(微秒)而不是毫秒。

至于支持,Date.now()performance.now()稍微多一点支持,现代浏览器都支持,甚至IE10/11 .

new Date().getTime() 有更多的支持(只是一点点)并且 2xDate.now() 慢。它比较慢,因为它创建了一个 object 然后调用了一些东西。

但是,此 caniuse.com 页面显示 performance.now() 几乎总是没问题,在 97.9%(截至目前)的情况下。

(从这里开始我只会提到Date.now(),但new Date.getTime()在下面的情况下是一样的)

用法

Date.now() 可以(并且应该)用于实现是否已经过了一段时间,假设速度是(非常重要的)关注点:它可以很容易地在 60fps 的计算机上获得正确的帧。它也可以用于时钟。它计算自 Unix Epoch 以来经过了多少毫秒(参见最佳答案)。对于需要更高准确性的应用程序(见下文),可以使用 performance.now()。如果您使用计时器,它的行为与 Date.now() 完全相同(因为它仍然以毫秒为单位计数),只是它更准确。要将 performance.now() 用作(稍微)更准确的 Date.now() 或 object,请将 performance.timing.navigationStart 添加到该值。这似乎与 Date.now() object 相差几毫秒,但我不确定这是谁的错。

准确度

据我所知,performance.now() 仅比 Chrome 桌面上的 Date.now() 准确 10 倍:考虑到时间跳跃0.1ms,但是,对于大多数基于时间的应用程序来说,这个精度已经足够了。 (有关其准确性的更多信息,请阅读 Firefox 部分)它可能看起来更准确,但事实并非如此:出于安全原因,它是有意限制的,因为利用时间可能允许恶意用户 access other applications.

Firefox

遗憾的是,如果您有 Firefox 用户并且无法访问 Cross-Origin headers,则 不可能实现这种性能(0.1 毫秒)。为了启用它,请将 Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp 放入您的文档中。用户还可以将此速度提高到 100 毫秒(或更高)。访问 Mozilla 文档了解更多信息。