【问题标题】:JavaScript: Iterating over datesJavaScript:迭代日期
【发布时间】:2016-07-09 13:51:34
【问题描述】:
在某些应用程序中,我需要生成指定范围内的日期数组。初始方法存在重大性能问题:
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);
【问题讨论】:
标签:
javascript
performance
profiling
【解决方案1】:
主要的一点是Date 是一个复杂的对象,它的比较需要很长时间。最好调用getTime()获取初等数值并进行比较,因为方法调用开销小于比较操作所需的时间。
for (
var current = new Date(from);
current.getTime() <= to.getTime();
current.setDate(current.getDate() + 1)
);
这比初始代码的运行速度快 3 倍 倍!但是让我们看看这里还能做什么。
针对Javascript optimizations for Internet Explorer问题提出了一些关于性能考虑的一般性建议。
一种优化性能的常用方法是在 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 看起来是合理的。我不太了解浏览器内部结构,但我认为原因是自动完成特定于引擎的优化。