我已经阅读了几个有关此主题的问题/文章,并且在我的解决方案中测试了使用for
的相同代码块大多数时间比each
快。
然而,我的问题与事实有关,而在我的页面中我有大约30个“循环”,使用each
的起始结果大约为5300毫秒(平均值),最大值为5900毫秒,最小值为4800毫秒。
在我将它们更改为for
并且最终结果出乎意料地变慢之后,花费更多时间作为之前的平均值(并且从未低于4800ms并且甚至高于6000ms).....但是当我在每个“循环块”中放置console.time('Time')
console.timeEnd('Time')
时,我得到了预期的结果(FOR更快)。
使用for
而不是each
的全球“时间”是如何缩短的?
P.S .- 完整的源代码非常庞大,这里的重要部分是唯一的变化是:循环each
转换为for
。
用于For循环的样本
var l = list.length;
for (var i=0;i<l; i++) {
}
用于每个循环的样本
$.each(list, function (i, item) {
});
更新#1
console.time('Time')
衡量时间
console.timeEnd('Time')
。在全球时间我只使用一个“计数器”。对于多个计数器,我当然使用不同的名称。更新#2
For
或Each
)list[i].SomeProperty
,imho时间差异永远不会归咎于内部代码(我认为)。更新#3
i
,ii
,iii
。 var l = list1.length; ...; l = list2.length;
这同样适用于for
变量i
,ii
,iii
。
更新#4
我注意到Chrome中存在一种奇怪的行为:以下模式用于重复多次,停止一段时间然后再次出现。
在所有这些测试中,我关闭了所有其他chrome选项卡和不必要的应用程序。尝试最小化不稳定的CPU可用性。
答案 0 :(得分:1)
由于您正在对空循环进行基准测试,因此您可以为JIT(即时编译器)提供足够的优化空间。可能是each
调用一起被删除,因为它没有副作用。然而,for循环必须运行,因为i
在范围中定义,包含 for循环,而不是在for循环内。
(function() {
for (var i=0; i<10; i++) {}
console.log(i); // outputs 10
})();
VS
(function() {
[0,1,2,3,4,5,6,7,8,9].forEach(function(i) {});
console.log(i); // i is not declared
})();
这也是为什么JSLint / JSHint抱怨i
被声明为以下代码两次的原因:
for (var i=0; i<10; i++) {}
for (var i=0; i<10; i++) {}