在某些应用程序中,我需要生成指定范围内的日期数组。初始方法存在一个主要的性能问题:
var from = new Date("2016-01-01");
var to = new Date("2016-12-31");
for (var current = new Date(from); current <= to; current.setDate(current.getDate() + 1);
答案 0 :(得分:1)
主要观点是Date
是一个复杂的对象,它的比较需要很长时间。最好调用getTime()
获取基本数值并进行比较,因为方法调用开销小于比较操作所需的时间。
for (
var current = new Date(from);
current.getTime() <= to.getTime();
current.setDate(current.getDate() + 1)
);
这比初始代码运行 3倍快!但是,让我们看看还能在这里做些什么。
针对Javascript optimizations for Internet Explorer问题提出了一些关于性能考虑因素的一般性建议。
优化效果的一种常用方法是缓存最高级别的&#39; for循环中的值。
他们说访问数组的length
属性需要一些时间,应该在循环初始化器中完成一次。在我们的例子中,我们在每次循环传递时调用to.getTime()
。我不是很确定,但猜测它比访问对象属性更耗时。
for (
var current = new Date(from), toTime = to.getTime();
current.getTime() <= toTime;
current.setDate(current.getDate() + 1)
);
这是jsPerf test的图表:
您可以看到缓存to.getTime()
价值未对Chrome浏览器产生任何影响,但对于Internet Explorer来说看起来很合理。我对浏览器内部结构了解不多,但我认为原因是引擎特定的优化是自动完成的。