【发布时间】:2023-03-17 14:57:01
【问题描述】:
我在 Ember.js 中看到了这个 sn-p:
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++。我想这可能是一个“性能技巧”,所以我决定在 jsperf 上做一个测试:
http://jsperf.com/predefined-length-vs-inline-defined-length
结果显示第二个更快。所以他们使用第一个肯定有另一个原因。
有人知道吗?非常感谢。
【问题讨论】:
-
您是否意识到差别不大。一个设置变量,一个不设置。较旧的浏览器需要存储长度以使其运行得更快。现代浏览器,没有区别。
-
这是因为每次迭代都会查找 for 循环中的语句,因此您可以节省一点缓存长度而不是每次迭代都查找它,但大多数情况下差异不是很明显,所以没关系。如前所述,较新的浏览器已经在内部对此进行了优化。
-
需要注意的是,如果顺序无关紧要,通常只是反向迭代更容易更快
for (var i=deps.length; i--;) ...
标签: javascript arrays performance loops