6

我已经阅读了几个关于这个主题的问题/文章,并在我的解决方案中测试了相同的代码块在for大多数情况下比each.

然而,我的问题与我的页面中的事实有关,其中我有大约 30 个“循环”,使用的起始结果each大约为 5300 毫秒(平均),最大值为 5900 毫秒,最小值为 4800 毫秒。

在我将它们更改为之后for,最终结果出人意料地变慢了,比以前的平均值花费更多的时间(并且从未低于 4800 毫秒,甚至高于 6000 毫秒)......但是当我放置console.time('Time') console.timeEnd('Time')在每个单曲中时“循环块”我得到了预期的结果(FOR 更快)。

全球“时间”怎么可能比使用foreach

请您指出一些可能的原因吗?

PS-完整的源代码很大,这里的重要部分是唯一的变化是:循环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 所要求的:每个循环的“内部代码”从未改变过,这不应该是原因,甚至当我们以相同的方式(使用Foror Each)访问这些对象时list[i].SomeProperty,恕我直言,时间差异永远不能归咎于内部代码(我认为)。

更新#3

  • 有时我使用不同变量的级联“循环” i, ii, iii.
  • 我经常在同一个函数中“重用”变量:

var l = list1.length; ...; l = list2.length;

这同样适用于for变量 i, ii, iii

更新#4

我注意到 Chrome 中有一个奇怪的行为:以下模式使用重复多次,下降一段时间然后再次上升。

  • DrawGUI: 6159.000ms UP AGAIN
  • DrawGUI:5990.000ms下降
  • DrawGUI:5804.000ms下降
  • DrawGUI:5416.000ms下降
  • DrawGUI:5315.000ms下降
  • DrawGUI: 5311.000ms下降
  • 绘制GUI:5325.000ms
  • DrawGUI:5248.000ms下降
  • DrawGUI:5010.000ms下降
  • DrawGUI: 4886.000ms下降
  • DrawGUI: 5645.000ms *UP AGAIN *
  • 绘制GUI:5247.000ms
  • 绘制GUI:5446.000ms

在所有这些测试期间,我关闭了所有其他 chrome 选项卡和不必要的应用程序。试图最小化不稳定的 CPU 可用性。

4

1 回答 1

1

由于您正在对空循环进行基准测试,因此您为 JIT(即时编译器)提供了足够的优化空间。each由于没有副作用,因此可能会一起删除调用。然而,for 循环必须按照i定义在包含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++) {}
于 2013-01-29T13:52:50.457 回答