我在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
结果显示第二个更快。所以他们必须使用第一个原因。
任何人都有任何想法?非常感谢。
答案 0 :(得分:4)
这不是一个小型性能优化的好习惯。在非常大的阵列中,它将产生显着的性能改进。这样做的原因是它“缓存”数组的长度值,NodeList等,这样在循环的退出条件下,您不必每次都重新访问该属性,因为它存储在变量中
与任何代码一样,性能增益会有所不同,可能会更快或更慢,具体取决于浏览器。
答案 1 :(得分:0)
这是一个棘手的问题,因为我们都认为计算长度会更好。但实际上,在任何一种情况下,计算长度只会发生一次。但是在第一个中,除了迭代器“i”之外,你还要声明一个变量。所以VM需要为它分配一个临时空间,直到循环结束;那个原因首先是最慢的。
希望这会对你有所帮助。