1.正序和倒序,倒序循環是編程語言中常用的性能優化方法
通常不會感覺到性能差異,但是在數據量很大時中,比如下面的代碼:
var arr=[]
for (var i = 0; i < 1000000; i++) {
arr[i] = i;
}
var start = +new Date();
for (var j = 0; j < arr.length; j++) {
arr[j] = j;
}
console.log("for正序序循環耗時:%s ms", Date.now() - start);
var start = +new Date();
for (var j = arr.length-1; j>-1; j--) {
arr[j] = j;
}
console.log("for倒序循環耗時:%s ms", Date.now() - start);
var start = +new Date();
arr.forEach((v,index)=>{
v=index
})
console.log("foreach循環耗時:%s ms", Date.now() - start);
經測試,
循環1萬次,輸出:
for正序序循環耗時:1 ms
for倒序循環耗時:1 ms
foreach循環耗時:1 ms
循環10萬次,輸出:
for正序序循環耗時:5 ms
for倒序循環耗時:3 ms
foreach循環耗時:2 ms
循環1百萬次,輸出:
for正序序循環耗時:20 ms
for倒序循環耗時:5 ms
foreach循環耗時:21 ms
循環1千萬次,輸出;
for正序序循環耗時:176 ms
for倒序循環耗時:25 ms
foreach循環耗時:217 ms
2.如果緩存數組長度
var arr=[]
for (var i = 0; i < 10000000; i++) {
arr[i] = i;
}
var start = +new Date();
for (var j = 0; j < length; j++) {
arr[j] = j;
}
console.log("for正序序循環耗時:%s ms", Date.now() - start);
var start = +new Date();
for (var j = length-1; j>-1; j--) {
arr[j] = j;
}
console.log("for倒序循環耗時:%s ms", Date.now() - start);
把之前的arr.length換成length,輸出:
for正序序循環耗時:0 ms
for倒序循環耗時:0 ms
性能得到了很大提升。
總結:
1.大數據量循環,儘量用倒序排序,至於倒序爲什麼性能更好,有知道的可以留言
2.for和foreach的性能相近,在數據量很大,比如一千萬時,foreach因爲內部封裝,比for更耗時
3.減少對象成員和數組項的查找,比如緩存數組長度,避免每次查找數組 length 屬性