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