性能-Date.now()与Date.getTime()


113
var timeInMs = Date.now();

每个MDN

var timeInMs = new Date(optional).getTime();

每个MDN

两者之间除了语法和通过第二个版本中的可选参数设置日期(不是当前日期)的能力之外,还有什么区别吗?

Date.now()更快-请查看jsperf


54
对于任何关心的人,Date.now()在IE9之前的Internet Explorer版本中均不起作用。我自己不在乎
guido 2012年

8
对于它的价值,您可以添加在developer.mozilla.org/en-US/docs/JavaScript/Reference/…中提到的兼容性垫片,以使Date.now()也可以在IE <9上运行。
jrajav 2012年

Answers:


105

这些都是相同的(在语义上进行编辑;使用,性能会更好一点.now()):

var t1 = Date.now();
var t2 = new Date().getTime();

但是,任何已经创建的Date实例的时间值都会在其构造时(或设置为其的任何时间/日期)冻结。也就是说,如果您这样做:

var now = new Date();

然后稍等片刻,随后的调用now.getTime()将告诉您设置变量的时间。


您是否认为在程序的开头创建一个日期对象,然后dateObj.setTime(Date.now())每次执行需要访问Date方法(例如dateObj.getMinutes())的异步操作时,只需更新该日期对象()或创建新的日期对象,性能会更高?
doubleOrt

3
@Taurus现代JavaScript运行时非常擅长对象创建和垃圾收集。除非您正在开发某种实时游戏内核,否则完全没有理由担心它。编写看起来不错而不易碎的代码。
尖尖的

1
不应该说谢谢,但要感谢(我希望我这样做不止一次)。
doubleOrt

57

它们实际上等效,但是您应该使用Date.now()。它更清晰,大约快一倍。

编辑:来源:http : //jsperf.com/date-now-vs-new-date


1
这是因为Date(optional).getTime();必须在获取当前时间之前分配空间以获取新的Date对象吗?
查理G

可能是。我希望它与Date构造函数正在做的所有事情有关,而不是与对象的实际分配有关。
jrajav 2012年

是的,我匆匆补充道-我的意思是分配以及创建对象所需要的一切。
查理G

4

在执行操作时,(new Date()).getTime()您将创建一个新的Date对象。如果重复执行此操作,它将比Date.now()慢大约2倍

同样的原则也应适用于Array.prototype.slice.call(arguments, 0)VS[].slice.call(arguments, 0)



2

有时,最好以Date对象的格式保留一些时间跟踪变量,而不是仅以毫秒为单位,以便在不重新实例化的情况下访问Date的方法。在那种情况下,Date.now()仍然会胜过新的Date()或类似的东西,尽管在我的Chrome上只有大约20%的优势,而在IE上只有很少的优势。

看到我的JSPERF

timeStamp2.setTime(Date.now()); // set to current;

timeStamp1 = new Date(); // set to current;

http://jsperf.com/new-date-vs-settime

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.