performance.now()vs Date.now()

Lew*_*wis 56 javascript time

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.nownow方法(Internet Explorer) - MSDN以获取更多信息.

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

  • 为什么 Developers.google.com/web/tools/lighthouse/audits/date-now 重定向到此 stackoverflow 问题 (5认同)
  • 这种精确度需要付出代价.它慢了50%.很高兴知道你是否需要紧密循环.https://jsperf.com/perf-vs-date/1 (4认同)
  • 糟糕,我的意思是慢 80%。:-( (3认同)
  • 请记住谷歌审计对 date.now() https://developers.google.com/web/tools/lighthouse/audits/date-now 的看法 (3认同)
  • 目前在 Firefox 中,performance.now() 快了 20%,但在其他浏览器中速度慢了 60% - 你可以自己检查:https://jsbench.me/s6jz9v29i3/1 (2认同)

Dre*_*ver 17

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

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


Inf*_*gon 12

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

长话短说

在非 Firefox 浏览器上,Date.now()精确到~1msperformance.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文档以获取更多信息。

  • 这不是浮点问题,精度[现在有意限制以减轻 Spectre 和其他问题](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) (3认同)