0

所以我早就知道

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') 

对此进行了几次测试后,我的结果尚无定论。我得到了两个测试用例的高和低数字。所以我的问题是,有什么更好的测试可以明确地表明预先获得长度会带来性能优势,以及这样做可以获得什么样的百分比增益?

4

3 回答 3

1

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

于 2011-10-06T19:07:40.467 回答
0

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

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

于 2011-10-06T19:05:12.337 回答
0

从理论上讲,您的两个示例之间的速度实际上不应该有任何差异。

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

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

也就是说,从 Joseph 发布的基准来看,如何在后台处理这显然不是那么直截了当。在 chrome 15 inline 的情况下实际上似乎更快,而在较旧的一些情况下它有点慢?o.0

于 2011-10-06T21:51:02.133 回答