2014-03-29 173 views
0

所以,我已经看到了这段代码在很多地方:JavaScript数组遍历 - 效率

for (var i = 0, len = myArray.length; i < len; i++) { 

} 

我知道是数组的长度缓存。

今天我看到这一点:

var len = myArray.length; var i = 0; while(i++ < len)

效率明智的,这两个是相同的,对不对?任何输入将不胜感激。

+0

递减速度更快。 Var i = myArray.length-1; while(i - ){// code here}。看看这里 - http://stackoverflow.com/questions/1340589/javascript-are-loops-really-faster-in-reverse –

+2

http://jsperf.com/javascript-array-length –

+0

真棒......那帮助...感谢吉祥物! – pj013

回答

0

设置一个jsperf测试用例这里:

http://jsperf.com/javascript-array-length

for (i = 0; i < arr.length; i++) { 
    //nothing 
} 

var arrlength = arr.length; 

for (i = 0; i < arrlength; i++) { 
    //nothing 
} 

var arrlength = arr.length, 
    i = 0; 

while (arrlength > i++) { 
    //nothing 
} 

var arrlength = arr.length; 

while (arrlength--) { 
    //nothing 
} 

如果测试用例可以改进,请让我知道在评论中。通过少量测试,似乎IE11针对while案件进行了更好的优化,而Chrome 31似乎更喜欢第二个for循环(与while案例非常相似)。

+0

确切地说,这就是我要提出的,不同的浏览器基于循环显示不同的表现,我猜想它是做出正确的选择。 – pj013

+0

在你的forwards while循环中,你从'1'迭代到'arr.length'(包含),而不是从'0'到'arr.length-1'(包含)。 – Oriol

+0

@Oriol - 虽然我不认为它会产生显着的差异,但我已经修改了该测试。 –

0

如果您有一个“正常”循环,您还可以将i < len更改为i !== len。这使循环更快,因为检查不平等是非常快的。变量的缓存并不重要,但它没有任何伤害。

因此JavaScript快速循环可以写成如下:

for (var i = 0, len = myArray.length; i !== len; i++) { 

} 

UPDATE

我做了一些性能测试前一阵子,这是我发现了什么。但是现在的浏览器并没有表现出相同的行为,而且相反(<!==更快)。下面是测试我刚才所说:http://jsperf.com/loop-inequality-check

所以,不要担心张贴以上;)