我已经阅读了有关此主题的若干问题/文章,并且在我的解决方案中测试了使用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')。对于全局时间,我只使用一个“计数器”。对于多个计数器,我当然使用不同的名称。
  • 在所有此“过程”中,没有Ajax请求,因此与该时间无关。

  • 更新#2
  • 正如@epascarello所要求的:每个循环的“内部代码”从未改变,这也不应该是原因,甚至当我们以相同的方式(使用ForEach)list[i].SomeProperty访问此对象时,恕我直言,时差永远不会归咎于内部代码(我认为)。

  • 更新#3
  • 有时我会使用级联“循环”,并使用不同的变量iiiiii
  • 我经常在同一函数内“重用”变量:
  • var l = list1.length; ...; l = list2.length;
    这同样适用于for变量iiiiii

    更新#4

    我注意到Chrome中有一个奇怪的行为:以下模式用于重复几次,下降一段时间,然后再次上升。
  • DrawGUI:6159.000ms 再上一次
  • DrawGUI:5990.000ms 下降
  • DrawGUI:5804.000ms 下降
  • DrawGUI:5416.000ms 下降
  • DrawGUI:5315.000ms 下降
  • DrawGUI:5311.000ms 下降
  • DrawGUI:5325.000ms
  • DrawGUI:5248.000ms 下降
  • DrawGUI:5010.000ms 下降
  • DrawGUI:4886.000ms 下降
  • DrawGUI:5645.000ms *再次(UP)*
  • DrawGUI:5247.000ms
  • DrawGUI:5446.000ms

  • 在所有这些测试中,我关闭了所有其他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++) {}
    

    09-11 17:40