Now() vs Date. now()

performance.now()Date.now()有什么不同?

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

67502 次浏览

它们都有不同的用途。

performance.now() is 相对于页面加载 and more precise in orders of magnitude. Use cases include benchmarking and other cases where a high-resolution time is required such as media (gaming, audio, video, etc.)

值得注意的是,performance.now()只能在较新的浏览器中使用(包括 IE10 +)。

Date.now()相对于 Unix 时代(1970-01-01 T00:00:00Z) ,并且依赖于系统时钟。自从 JavaScript 开始使用以来,用例包括相同的旧日期操作。

有关更多信息,请参见 When milliseconds are not enough: performance.nownow method (Internet Explorer) - MSDN

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

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

为了更好的理解访问 链接

我注意到的第一件事是 performance.now()Date.now()慢(400k 的操作比我电脑上的100k)。但是,如果只是计数,那么使用 performance.now()是更好的选择。它完全取决于代码开始运行的时间,时钟的变化会影响时间。它也更准确: 计算我们(微秒)而不是毫秒。

至于支持,Date.now()的支持略多于 performance.now(),因为两者都得到了现代浏览器 甚至 IE10/11的支持。

new Date().getTime() has even more support (just a bit) and is 2倍 slower than Date.now(). It's slower because it creates an object and then calls something.

然而,这个 caniuse.com页面显示,performance.now()几乎总是正常的,在97.9% 的情况下(到目前为止)。

(从这里开始,我将只参考 Date.now(),但是 new Date.getTime()在下面的例子中是一样的)

Usage

Date.now()可以(而且应该)用于实现如果一些时间已经过去,假设速度是(非常主要的)关注点: 它可以很容易地获得正确的帧在一台60 fps 的计算机上。它也可以用于时钟。它计算从 Unix 时代到现在已经过去了多少毫秒(参见顶部的答案)。对于需要更高精度的应用程序(见下文) ,可以使用 performance.now()。如果使用计时器,它的行为与 Date.now()完全相同(因为它仍然以毫秒为单位计数) ,只是它更精确。要使用 performance.now()作为(稍微)更精确的 Date.now()或对象,请将 performance.timing.navigationStart添加到值中。这看起来确实离 Date.now()对象有几毫秒的距离,但我不确定这是谁的错。

准确性

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

Firefox

遗憾的是,如果你有火狐用户并且没有访问 Cross-Origin 头文件,这个性能(0.1 ms) 是不可能的。相反,你只能得到2毫秒的精度。为了启用它,在文档中放置 Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp。用户还可以将这个速度提高到100毫秒(或更高)。有关更多信息,请访问 Mozilla文档。