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 开始以来相同的旧日期操作。

有关详细信息,请参阅当毫秒不够时:performance.nownow方法 (Internet Explorer) - MSDN。

官方 W3C 规范可以在这里找到:高分辨率时间 API

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

为了更好地理解,请访问链接。

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

至于支持,Date.now()的支持略多于performance.now(),因为现代浏览器甚至Internet Explorer 10和11都支持两者。

new Date().getTime() 的支持只是多了一点,并且比 Date.now()2 倍。它的速度较慢,因为它创建了一个大对象,但只调用单个函数。

但是,这个 caniuse.com 页面显示,在98.25%(截至目前)的情况下,performance.now()几乎总是可以的。

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

用法

Date.now()可以(并且应该)用于增量时间(特别是requestAnimationFrame():它可以轻松地在 120fps 显示器上获得正确的帧(并且速度是原来的两倍)!它也可以用于时钟。它计算自Unix时代以来经过了多少毫秒(有关更多详细信息,请参阅顶部答案)。对于需要更高精度的应用(见下文),可以使用performance.now()。如果您使用计时器,它的行为与Date.now()完全相同(因为它仍然以毫秒为单位计数),只是它更准确。若要将performance.now()用作(稍微)更准确的Date.now()或对象,请向值添加performance.timing.navigationStart。这似乎与Date.now()对象相差几毫秒,但至于为什么我不确定。准确性

据我所知,与Chrome桌面上的Date.now()相比, performance.now()的精度仅高出10倍:考虑到0.1ms的时间跳跃,但是,对于大多数时间严格的应用程序来说,这种精度已经足够好了。(阅读 Firefox 部分,了解有关其准确性的更多信息。它可能看起来更准确(如313015.59999999404),但事实并非如此:出于安全原因,它被故意限制,因为利用时间可能允许恶意代码访问其他应用程序。

火狐

可悲的是,如果您有 Firefox 用户并且无法访问跨源标头,则无法实现此性能(0.1 毫秒)。相反,您只能获得 2ms 的精度(也与 Date.now() 相同!要启用它,请将Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp放在文档中。用户还可以将此速度提高到 100 毫秒(或更高)。访问 Mozilla 文档了解更多信息。

相关内容

  • 没有找到相关文章

最新更新