JavaScript:遍历日期

JavaScript: Iterating over dates

在某些应用程序中,我需要生成一组指定范围内的日期。初始方法存在重大性能问题:

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);

要点是 Date 是一个复杂的对象,它的比较需要很长时间。最好调用getTime()获取基本数值并进行比较,因为方法调用开销小于比较操作所需的时间。

for (
  var current = new Date(from);
  current.getTime() <= to.getTime();
  current.setDate(current.getDate() + 1)
);

这比初始代码运行速度快 3x 倍!但是让我们看看这里还能做什么。

针对 Javascript optimizations for Internet Explorer 问题提出了一些关于性能注意事项的一般性建议。

One common way to optimize performance is caching the 'max' value in for loops.

他们说访问数组的 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 来说似乎是合理的。我不太了解浏览器内部结构,但我认为原因是自动完成了特定于引擎的优化。