Javascript 用于循环性能:在变量中存储数组长度

Javascript 用于循环性能:在变量中存储数组长度,javascript,performance,for-loop,Javascript,Performance,For Loop,考虑相同循环迭代的两个版本: for (var i = 0; i < nodes.length; i++) { ... } for(变量i=0;i

考虑相同循环迭代的两个版本:

for (var i = 0; i < nodes.length; i++) {
    ...
}
for(变量i=0;i

var len=nodes.length;
对于(变量i=0;i

后一个版本比前一个版本快吗?

我相信
节点.length
已经定义好了,每次使用都不会重新计算。因此,第一个示例会更快,因为它定义的变量少了一个。尽管差异是不明显的。

更新:16/12/2015

由于这个答案似乎仍然有很多观点,我想随着浏览器和JS引擎的不断发展,重新审视这个问题

我没有使用JSPerf,而是使用原始问题中提到的两种方法来循环数组。我已将代码放入函数中,以分解功能,希望在实际应用程序中可以这样做:

函数getestArray(numEntries){
var testArray=[];
对于(变量i=0;i运行测试()
如果
节点
DOM节点列表
,那么第二个循环会快得多,因为在第一个循环中,每次迭代都要查找DOM(非常昂贵)

公认的答案是不对的,因为任何像样的引擎都应该能够使用如此简单的环体

请参阅-至少在V8中,将其实际存储在变量中如何更改寄存器分配-在使用变量的代码中,
sum
变量存储在堆栈上,而对于
数组.length
-in-a-loop-code,它存储在寄存器中。我想SpiderMonkey和Opera也在发生类似的事情

据作者说,70%的时间。这里所有答案中给出的这些错误的JSperf给出了误导性的结果,人们从中得出了错误的结论

一些危险信号是将代码放在测试用例中而不是函数中,没有测试结果的正确性,或者使用某种消除死代码的机制,在设置或测试用例中定义函数而不是全局。。为了保持一致性,您还需要在任何基准测试之前预热测试函数,这样就不会在定时部分进行编译。

根据以下内容进行编译被视为错误代码:

for(i=0;i
以下代码被认为是良好的代码:

var arrLength=arr.length;
对于(i=0;i
由于访问DOM的速度很慢,因此编写以下内容来测试该理论:


我的测试脚本
初始化大数组
缓慢迭代大数组
快速迭代大数组

慢时间:

快速时间:

var myArray=[]; 函数initArray(){ var长度=1e6; var i; 对于(i=0;i
这一直是我使用过的所有基准测试中性能最好的

for (i = 0, val; val = nodes[i]; i++) {
    doSomethingAwesome(val);
}

我认为你应该尽可能简单地对你的意思进行编码;这意味着使用
I
。你的答案是最精确的。我认为差异并不显著,特别是考虑到chrome。
length
是一个属性,而不是一个函数。根据它的jsperf,这个答案是错误的,或者至少不再正确但是,意图是正确的。引用的jsperf使用了一个不重要的循环大小。对于1000次迭代,几乎没有差别。将循环提高到100000表示首先设置长度(而不是循环中的arr.length)实际上是33%slowe
for (i = 0, val; val = nodes[i]; i++) {
    doSomethingAwesome(val);
}