JavaScript:迭代日期

时间:2016-03-22 15:21:24

标签: javascript performance profiling

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

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

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的图表:

jsPerf Browserscope Chart

您可以看到缓存to.getTime()价值未对Chrome浏览器产生任何影响,但对于Internet Explorer来说看起来很合理。我对浏览器内部结构了解不多,但我认为原因是引擎特定的优化是自动完成的。