【问题标题】: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 看起来是合理的。我不太了解浏览器内部结构,但我认为原因是自动完成特定于引擎的优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2020-02-13
      • 2019-09-10
      • 2017-09-04
      • 2015-05-23
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多