Javascript 循环优化改变方向

Javascript 循环优化改变方向,javascript,optimization,Javascript,Optimization,我读过循环优化(N.Zakas,Javascript优化)。在那里,有人写道,对数组使用逆循环比直接循环更优化。这似乎完全合乎逻辑: for(var i = 0; i < length; i++){...} -检查条件+增加变量i(在一个表达式中) 但是,对于Chrome,我得到了意想不到的结果 var len = 100000000, arr = new Array(len), i = len - 1, start = new Date(), end; for(i = 0; i &

我读过循环优化(N.Zakas,Javascript优化)。在那里,有人写道,对
数组使用
逆循环
比直接循环更优化。这似乎完全合乎逻辑:

for(var i = 0; i < length; i++){...}
-检查条件+增加变量
i
(在一个表达式中)
但是,对于Chrome,我得到了意想不到的结果

var len = 100000000,
arr = new Array(len),
i = len - 1,
start = new Date(), 
end;

for(i = 0; i < len; i++){
    arr[i] = 1;
}

end = new Date();

console.log(end - start);
var len=100000000,
arr=新阵列(len),
i=len-1,
开始=新日期(),
结束;
对于(i=0;i
直接循环返回结果接近4500ms,但反向循环。。。9500米


为什么?

仅仅因为(i=length;i--;)的
中的代码更少,并不意味着完成的事情更少;
i
仍然需要递增(或者在本例中,递减),并且仍然需要进行检查(在此之前是
i
,现在是
i!=0

我可能认为时间上的差异是由于
for(I=0;I
是一个非常常见的构造,因此优化非常常见(因此现代编译器/解释器在显式优化这些方面投入了资源)。但我承认这只是猜测

当您弹出数组的内容时,向后迭代可能会显示出速度的极大提高:

(i=0;i
可能正在从数组中删除第一个元素,并向后移动所有其他元素以填充其在引擎盖下的位置

鉴于:

用于(i=arr.length;i--;)arr.splice(i,1)
可能只需要减少引擎盖下阵列的长度(更便宜!)

我不确定这是否是您要进行的优化,但takaway并不是一般意义上的“向后迭代更快”。

是。但那不是你在这里做的。您正在反向构造一个数组,这非常奇怪(请阅读:不太可能优化)

如果您首先开始分配最高索引,我猜数组开始时是稀疏数组,这比连续数组效率低得多。如果引擎意识到您正在做什么,则分配本身将变慢,或者转换为普通阵列。

相反,如果从
0
开始,引擎可以根据需要扩展阵列,并从一开始就使用高效的内存表示。顺便说一句,我希望速度更快。

“比直接循环更优化。”---这没有什么意义。Zakas在谈论展开循环和一种叫做Duffs设备的技术。使用
while
循环,而不是
for
。好的,让我们在性能范围内说得更好你误读了Zakas。基于,他的示例代码在更高效的版本中使用了do while循环,而不是for循环。“对不起,这句话(关于向后循环)错了吗?”——它没有包含所有的事实:迭代不是真正的慢循环和应该优化的循环,而是您在循环体中所做的真正工作。换句话说,这就像说红色汽车比蓝色汽车快。
var len = 100000000,
arr = new Array(len),
i = len - 1,
start = new Date(), 
end;

for(i = 0; i < len; i++){
    arr[i] = 1;
}

end = new Date();

console.log(end - start);