优化javascript for循环

时间:2011-10-06 18:59:43

标签: javascript jquery client-side-scripting

所以我有known一段时间

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

}

更有效
for ( var i=0; myArray.length; i++ ){

}

用于大型数组。但是想知道前者真正给你带来了多少性能提升?

今天我打算做一些基准测试。我创建了一个数组并将100,000个数字输入其中。

    var array = []; 
    for( var i = 0; i < 100000; i++ ) 
         array.push(i);  

然后,我通过对数组中的每个数字执行console.log来测试上面的两个循环,并对进程进行计时。

console.time('loop'); 

for( var i = 0; i < array.length; i++ )
     console.log(i); 

console.timeEnd('loop');  

并进行第二次测试

console.time('loop'); 

 for( var i = 0, len = array.length; i < len ;i++ )
     console.log(i) 

console.timeEnd('loop') 

经过几次测试后,我的结果尚无定论。我得到两个测试用例的高和低数字。所以我的问题是,什么是一个更好的测试,明确表明预先获得长度具有性能优势,以及这样做的百分比增益是多少?

3 个答案:

答案 0 :(得分:1)

这是一个相关的jsperf: http://jsperf.com/caching-array-length/4 这表明差异可能非常小。

答案 1 :(得分:0)

在这种情况下,它没有任何区别。访问数组的length属性是一个非常快速的操作,因为每次数组更改时它都会更新,因此您只是检索一个数字。

但是,如果您正在循环说明通过document.querySelectorAll获得的某些元素,那么缓存结果可能是一个好主意,因为调用querySelectorAll可能会很昂贵,并且如果结果不会改变,你不希望每次迭代都运行它。

答案 2 :(得分:0)

从理论上讲,两个例子之间的速度实际上应该没有任何区别。

第一个例子运行得更快的想法来自像php这样的语言,其等价物是“$ i&lt; sizeof($ array)”,因为sizeof在循环的每次迭代中都计算了数组的长度。与PHP不同,JavaScript已经知道它的数组有多长,所以你几乎只是直接读取数字。

结果是,在JavaScripts情况下,读取“arrlen”和“somearray.length”之间的唯一区别是指针指向的位置,因此速度几乎相同。

也就是说,根据约瑟夫发布的基准测试结果,如何在引擎盖下处理它显然不那么直截了当。在chrome 15的情况下,内联实际上看起来更快,而在较旧的几内线它有点慢? o.0