在循环之前定义数组的长度是一种好习惯吗?

时间:2014-06-22 15:11:49

标签: javascript arrays performance loops

我在Ember.js中看到了这个片段:

  for (var i=0, l=deps.length; i<l; i++) {
    if (deps[i] === 'exports') {
      reified.push(exports = {});
    } else {
      reified.push(requireModule(resolve(deps[i])));
    }
  }

请查看var i=0, l=deps.length; i<l; i++,在循环之前定义deps的长度。我很奇怪为什么他们必须这样做,而不是只使用var i=0; i<deps.length; i++。我想也许这是一个&#34;性能技巧&#34;,所以我决定对jsperf进行测试:

http://jsperf.com/predefined-length-vs-inline-defined-length

结果显示第二个更快。所以他们必须使用第一个原因。

任何人都有任何想法?非常感谢。

2 个答案:

答案 0 :(得分:4)

这不是一个小型性能优化的好习惯。在非常大的阵列中,它将产生显着的性能改进。这样做的原因是它“缓存”数组的长度值,NodeList等,这样在循环的退出条件下,您不必每次都重新访问该属性,因为它存储在变量中

与任何代码一样,性能增益会有所不同,可能会更快或更慢,具体取决于浏览器。

答案 1 :(得分:0)

这是一个棘手的问题,因为我们都认为计算长度会更好。但实际上,在任何一种情况下,计算长度只会发生一次。但是在第一个中,除了迭代器“i”之外,你还要声明一个变量。所以VM需要为它分配一个临时空间,直到循环结束;那个原因首先是最慢的。

希望这会对你有所帮助。