我已经阅读了关于循环优化(N.Zakas,Javascript Optimization)的内容。在那里,有人写道,inverse loop
使用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);
直接循环返回结果接近4500ms,但是反转循环... 9500ms!
为什么?
答案 0 :(得分:1)
仅仅因为import csv
with open(filename) as f:
reader = csv.reader(f)
csv_rows = list(reader)
中的代码较少并不意味着事情的完成就会减少; for(i = length;i--;)
仍然需要增加(或者在这种情况下,递减),并且仍然需要进行检查(在它i
之前,它现在是i < length
)。
我可能期望时间上的差异是由于i != 0
是一个非常常见的结构,因此非常常见(因此现代编译器/解释器有资源投入明确优化这些)。但我承认这是猜测。
向后迭代 可能会显示速度大幅增加的一种情况是当你弹出数组的内容时:
for(i = 0; i < length; i++)
可能会从数组中移除第一个元素,并向后移动所有其他元素以填充其位置。
,而:
for(i = 0; i < arr.length; i++) arr.splice(i,1);
可能只需要减少引擎盖下阵列的长度(便宜得多!)。
我不确定这是否是您要进行的优化,但是不是&#34;向后迭代更快!&#34;在一般意义上。
答案 1 :(得分:0)
是的,iterating an array backwards can be faster。但那不是你在这里做的。你正在反向构建一个数组,这很奇怪(读:不太可能优化)。
如果你首先开始分配最高的索引,我猜数组是以稀疏数组开始的,这比连续数组效率低得多。一旦引擎实现你正在做的事情,任务本身将会更慢,或转换为正常数组
相反,如果从test@ubuntu:~# updatedb # To update the locate database
test@ubuntu:~# locate sparse_hash_map
/usr/include/google/sparsehash/sparse_hash_map
test@ubuntu:~# ln -s /usr/include/google/sparsehash/sparse_hash_map /usr/include/google/sparse_hash_map
开始,引擎可以根据需要增长数组,并从一开始就使用高效的内存表示。顺便说一下,我希望arr.fill(1)
更快。