使用 JS Date 对象获取当前时间(以毫秒为单位)的最快、最轻的方法

问题描述 投票:0回答:3

有多种方法可以使用

Date
对象获取当前时间(以毫秒为单位):

(new Date()).getTime();
+new Date();
Date.now();

假设您不需要创建对象,只需要当前时间(以毫秒为单位),那么哪一个最有效?在性能方面。

编辑:我知道大多数开发人员不会关心这一点,但当您在低技术嵌入式环境中工作或只是为了消除好奇心时,这可能很重要。

javascript performance date
3个回答
20
投票

Date.now()
获胜。 请参阅jsPerf 测试

但正如上面的评论所述,与您将要做的任何其他事情相比,CPU 成本可能并不有趣。

@techfoobar 提到了分配

Date
对象的成本(或者,实际上,垃圾收集那些
Date
对象的成本)。这可能是也可能不是一个重大胜利,因为
Date.now()
可能正在分配数字,这将是同样昂贵的。


1
投票

此外,如果时间戳是为数据添加时间戳以外的任何内容获取的,例如代码执行的时间,最好考虑一下是否可以通过 setTimeout 或 setInterval 调用来实现相同的目的,而无需直接访问时间戳值。


0
投票

由于这里没有讨论performance.now(),而且jsperf.com现在似乎已经宕机了,所以我做了一些简单的测试,可以看出,快速度的排名是:

  1. Date.now()——1000万次迭代大约需要1秒
  2. new Date()——1000万次迭代大约需要2秒
  3. performance.now()——1000万次迭代大约需要4秒

遗憾的是,performance.now() 看起来比 Date.now() 慢 4 倍。那是在 Chrome 上。

这是我的代码,升级到 1 亿次迭代,其中 Performance.new() 测试变得更糟。不要担心我使用了 Performance.now() 作为所有 3 个选项的测量计时器,重要的是循环中的内容。我在上次测试中进行了 1 亿次迭代,因为我想看看 new Date() 和 Date.now() 上的垃圾收集是否会启动并惩罚我们。但不,更糟糕的不是它们,而是 Performance.now() 方法。

function perftest(iterations, fn) {
    const start = performance.now();
    for(let i = 0; i < iterations; i++)
        fn();
    return performance.now() - start;
}

> perftest(100000000, () => Date.now())
< 11285.5
> perftest(100000000, () => new Date())
< 22834.59999999404
> perftest(100000000, () => performance.now())
< 48602.40000000596

顺便说一下,通过 fn() 函数调用的间接调用真的很小。与直接在循环中调用测试语句相比,它总共增加了大约 200 毫秒。

© www.soinside.com 2019 - 2024. All rights reserved.