performance.now()和之间有什么区别Date.now()?
我应该考虑performance.now()作为替代品,Date.now()因为performace.now()它更加一致和独立吗?
rin*_*t.6 44
它们都有不同的用途.
performance.now()是相对于页面加载和数量级更精确.用例包括基准测试和其他需要高分辨率时间的情况,如媒体(游戏,音频,视频等)
应该注意的performance.now()是,仅适用于较新的浏览器(包括IE10 +).
Date.now()是相对于Unix纪元(1970-01-01T00:00:00Z)并且依赖于系统时钟.自JavaScript开始以来,用例包括相同的旧日期操作.
请参阅毫秒不足时:performance.now和now方法(Internet Explorer) - MSDN以获取更多信息.
官方的W3C规范可以在这里找到:高分辨率时间API
Inf*_*gon 12
我注意到的第一件事是,它performance.now()比(400k 操作与我的计算机上的 100k 操作)慢4 倍。Date.now()但是,如果您想要自页面加载以来的准确计时/时间,那么使用performance.now()是更好的选择。它完全取决于代码开始运行以来的时间,时钟更改不会影响时间。它也更准确:计算十分之一毫秒而不是毫秒。
长话短说
在非 Firefox 浏览器上,Date.now()精确到~1ms并performance.now()精确到~0.1ms除非在某些情况下。如果您使用 Firefox,两者的准确度都会下降到2ms。他们都非常快。
支持和速度
至于支持,Date.now()比 稍微多一些performance.now(),因为现代浏览器都支持,甚至 Internet Explorer 10 和 11。
new Date().getTime()只是有更多的支持,并且速度比Date.now(). 它比较慢,因为它创建了一个大对象,但只调用一个函数。
然而,这个caniuse.com页面显示performance.now(),在 98.25%(截至目前)的情况下,这几乎总是可以的。
(从现在开始我只会参考Date.now(),但new Date.getTime()在下面的情况下是相同的)
用法
Date.now()可以(并且应该)用于增量时间(特别是requestAnimationFrame():它可以轻松地在 120fps 显示器上获得正确的帧!它也可以用作时钟。它计算自 Unix 纪元以来已经过去了多少毫秒(参见最佳答案)更多细节)。
一个特别有趣的用例是Date.now()在一帧中多次调用,以便在经过一定时间后停止计算。由于Date.now()速度相当快,这应该不是什么大问题。
对于需要更高精确度的应用程序(见下文),performance.now()可以使用。Date.now()它的行为与使用计时器完全相同(因为它仍然以毫秒为单位计数),只是它更准确。
要用作performance.now()(通常)更准确Date.now()的对象,请添加performance.timing.navigationStart该值。这似乎与物体相差几毫秒Date.now(),但至于为什么我不确定。只是不要将两者结合起来
准确性
据我所知,与我的 Chrome 桌面相比,performance.now()仅准确 10 倍Date.now():考虑到 0.1 毫秒的时间跳跃,但是,对于大多数时间严格的应用程序来说,这个准确度已经足够好了。(有关其准确性的更多信息,请阅读 Firefox 部分。)它可能看起来更准确(如313015.59999999404),但事实并非如此:出于安全原因,它被有意限制,因为利用时间可能允许恶意代码访问其他应用程序。如果您希望它不以如此难看的方式显示,您可以使用performance.now().toFixed(1)使其更加准确。Number您还可以通过在开头添加加号来使其成为 a :+performance.now().toFixed(1)应该可以。
火狐浏览器
遗憾的是,如果您有 Firefox 用户并且无权访问跨源标头,则不可能实现这种性能(0.1 毫秒) 。相反,您只能获得 2ms 的精度(也与 相同Date.now()!)为了启用它,请将Cross-Origin-Opener-Policy: same-origin和放入Cross-Origin-Embedder-Policy: require-corp您的文档中。用户还可以将此速度提高到 100ms(或更高)。请访问Mozilla文档以获取更多信息。