在Javascript中的循环性能

正如我的研究让我相信,循环是JavaScript语言中最快的迭代构造。 我在想,也为for循环声明一个条件长度值会更快一些…为了使它更清晰,你认为下面哪个更快?

例子一

for(var i = 0; i < myLargeArray.length; i++ ) { console.log(myLargeArray[i]); } 

例子TWO

 var count = myLargeArray.length; for(var i = 0; i < count; i++ ) { console.log(myLargeArray[i]); } 

我的逻辑是这样的:在每次迭代中,在每次迭代中访问myLargeArray的长度在计算上都比较昂贵,那么访问如示例2所示的简单整数值?

与下面的一些陈述相反,数组的长度不是在每次迭代时计算的。 Array的长度是一个属性,通过修改poppushshiftunshiftsplice等操作来设置。

尽pipe属性查找的成本高于本地variables,但您会看到性能稍差。 因此caching长度是一个好主意。 但是,除非你处理大数据集,否则你不会看到很大的差别。

尽pipe在每次迭代中确实计算了长度,但还是有一个特例。 HTML节点集合就是这种情况。 由于这些是活动对象,所以在数组中,长度不是一个属性。 如果你这样做:

 for (var i=0; i < collection.length; i++) { collection[i] }; 

然后,在每次迭代中收集都被parsing。

至于优化for循环,我通常使用这些技术进行caching:

 // if order is of no concern, just iterate from length-1 to 0 for (var i = arr.length - 1; i >= 0; i--){ arr[i] }; // use the for loop statement to set up scoped variables for (var i=0, length = arr.length; i < length; i++) { // do something } 

从JavaScript的花园 , JavaScript的怪癖伟大的资源。

虽然length属性是在数组本身定义的,但是在循环的每次迭代中进行查找仍然存在开销。 虽然最近的JavaScript引擎可能会在这种情况下应用优化,但是无法确定代码是否会在这些新引擎之一上运行。

我不认为每次使用第二个版本都会有什么损失,但是如果数组长度实际上每次都是从头开始计算,除非数组实际被循环变化,否则我会感到惊讶。

不要忘记,你可以在for的第一部分声明多个variables:

 for(var i = 0, count = myLargeArray.length; i < count; i++ ) { console.log(myLargeArray[i]); } 

从高性能的JavaScript

每次迭代减less工作量:

 //original loops for (var i=0; i < items.length; i++){ process(items[i]); } var j=0; while (j < items.length){ process(items[j++]]); } var k=0; do { process(items[k++]); } while (k < items.length); //minimizing property lookups for (var i=0, len=items.length; i < len; i++){ process(items[i]); } var j=0, count = items.length; while (j < count){ process(items[j++]]); } var k=0, num = items.length; do { process(items[k++]); } while (k < num); //minimizing property lookups and reversing for (var i=items.length; i--; ){ process(items[i]); } var j = items.length; while (j--){ process(items[j]]); } var k = items.length-1; do { process(items[k]); } while (k--); 

减less迭代次数:

 //credit: Jeff Greenberg var i = items.length % 8; while(i){ process(items[i--]); } i = Math.floor(items.length / 8); while(i){ process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); } 

查看JavaScript优化

是的,你是正确的myLargeArray.length是循环的每次迭代计算(第一个例子)。 link1 link2

 for(var i = 0; i < myLargeArray.length; i++ ) { console.log(myLargeArray[i]); }