我已经阅读了有关此主题的若干问题/文章,并且在我的解决方案中测试了使用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
访问此对象时,恕我直言,时差永远不会归咎于内部代码(我认为)。 更新#3
i
,ii
和iii
。 var l = list1.length; ...; l = list2.length;
这同样适用于
for
变量i
,ii
和iii
。更新#4
我注意到Chrome中有一个奇怪的行为:以下模式用于重复几次,下降一段时间,然后再次上升。
在所有这些测试中,我关闭了所有其他chrome标签页和不必要的应用程序。试图最小化不稳定的CPU可用性。
最佳答案
由于您正在对空循环进行基准测试,因此可以为JIT(及时编译器)提供足够的优化空间。可能是each
调用被全部删除,因为它没有副作用。但是,因为i
是在包含for循环的作用域中定义的,而不是在for循环内部,所以必须运行for循环。
(function() {
for (var i=0; i<10; i++) {}
console.log(i); // outputs 10
})();
与
(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++) {}