几年前,我听说每次循环运行时都会评估for循环的条件部分。此外,该属性访问相对昂贵。
从那时起,我就有了写循环的习惯:
var data = [1,2,3,4,5,6];
for (var i=0, l=data.length; i<l; i++) {
// do stuff
}
这是不必要的优化吗?现代Javascript编译器/解释器是否已经优化了条件部分,因此不会多次访问length属性?
无论如何,这有多大影响?
答案 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中这是一件昂贵的事情)。
我建议用另一种方式来看待它:如果这个,可以想象的最常见的情况,没有优化,那么很可能还有很多其他情况你的特定引擎没有优化......那么多手动优化的想法似乎有点荒谬。