【发布时间】:2017-01-31 14:59:27
【问题描述】:
我已阅读有关循环优化(N.Zakas,Javascript 优化)的信息。在那里,写到使用inverse loop for arrays 比直接循环更优化。这似乎完全合乎逻辑:
for(var i = 0; i < length; i++){...}
- 检查条件
- 增加变量i
for(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);
直接循环返回结果接近 4500 毫秒,但反向循环... 9500 毫秒!
为什么?
【问题讨论】:
-
"比直接循环更优化。" --- 这没什么意义。
-
N. Zakas 正在谈论展开循环和一种称为 Duffs Device -en.wikipedia.org/wiki/Duff%27s_device 的技术。使用
while循环,而不是for。 -
好的,在性能范围内说得更好
-
你误读了 Zakas。基于jonraasch.com/blog/…,他的示例代码在更高效的版本中使用了do while循环,而不是for循环。
-
"对不起,这个陈述(关于向后循环)错了吗?" --- 它并不包含所有真相:迭代并不是真正的慢和应该优化的东西,而是你在循环体中所做的真正工作。换句话说 - 这就像说红色汽车比蓝色汽车快。