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.now
和now
方法 (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-origin
和Cross-Origin-Embedder-Policy: require-corp
放在文档中。用户还可以将此速度提高到 100 毫秒(或更高)。访问 Mozilla 文档了解更多信息。