是否优化了环路条件?

时间:2012-12-11 22:25:07

标签: javascript optimization compiler-construction for-loop

几年前,我听说每次循环运行时都会评估for循环的条件部分。此外,该属性访问相对昂贵。

从那时起,我就有了写循环的习惯:

var data = [1,2,3,4,5,6];
for (var i=0, l=data.length; i<l; i++) {
    // do stuff
}

这是不必要的优化吗?现代Javascript编译器/解释器是否已经优化了条件部分,因此不会多次访问length属性?

无论如何,这有多大影响?

4 个答案:

答案 0 :(得分:3)

  

这是不必要的优化吗?

是的,它几乎总是如此。我确信每个JavaScript实现都有O(1)复杂度来获取长度。我能想象的唯一一个你真正想要使用的最简单的优化是游戏引擎。但是如果你写一个&#34;正常&#34;它真正赢得的JavaScript应用程序并不重要 - 如果没有优化,您的代码可以更好地阅读。

与循环体相比,您还需要看到可能的性能损失。它很可能涉及访问其他变量,您正在迭代的元素的属性,甚至修改DOM(通常像地狱一样昂贵)。

如果在大多数情况下循环性能是一个大问题,那么你可以非常肯定供应商不会实现Array.prototype.forEach(),这会带来每次&#34;迭代的函数调用开销#34 ; - 与DOM操作(特别是在使用jQuery&#39; s .each()时)相比,即使是便宜的。

答案 1 :(得分:1)

除了ThiefMaster所说的,通常用以下内容迭代数组:

var arr = [1, 2, 3];
arr.forEach(function(el, i) {
   //...
});

$.each(arr, function(i, el){
   //...
});

如果每次迭代调用整个函数通常是可以接受的,那么几乎肯定会检查数组的长度。

答案 2 :(得分:1)

检查出来:https://blogs.oracle.com/greimer/entry/best_way_to_code_a

在mozilla中:

for (var i=0; i<arr.length; i++) //4ms
for (var i=0, len=arr.length; i<len; i++) //3ms

我认为这是一个莱卡问题。

答案 3 :(得分:0)

这种特殊情况非常普遍,可以安全地假设它已经过优化。例如,在Java中,for循环在他们的文档中被列为唯一可以优化远程边界检查的情况(在java中这是一件昂贵的事情)。

我建议用另一种方式来看待它:如果这个,可以想象的最常见的情况,没有优化,那么很可能还有很多其他情况你的特定引擎没有优化......那么多手动优化的想法似乎有点荒谬。