有多种方法可以使用
Date
对象获取当前时间(以毫秒为单位):
(new Date()).getTime();
+new Date();
Date.now();
假设您不需要创建对象,只需要当前时间(以毫秒为单位),那么哪一个最有效?在性能方面。
编辑:我知道大多数开发人员不会关心这一点,但当您在低技术嵌入式环境中工作或只是为了消除好奇心时,这可能很重要。
Date.now()
获胜。 请参阅jsPerf 测试。
但正如上面的评论所述,与您将要做的任何其他事情相比,CPU 成本可能并不有趣。
@techfoobar 提到了分配
Date
对象的成本(或者,实际上,垃圾收集那些 Date
对象的成本)。这可能是也可能不是一个重大胜利,因为 Date.now()
可能正在分配数字,这将是同样昂贵的。
此外,如果时间戳是为数据添加时间戳以外的任何内容获取的,例如代码执行的时间,最好考虑一下是否可以通过 setTimeout 或 setInterval 调用来实现相同的目的,而无需直接访问时间戳值。
由于这里没有讨论performance.now(),而且jsperf.com现在似乎已经宕机了,所以我做了一些简单的测试,可以看出,快速度的排名是:
遗憾的是,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 毫秒。