我想了解構造數組的性能差異。運行下面的程序,我對下面的輸出不解:創建Javascript數組的不同方法
Time for range0: 521
Time for range1: 149
Time for range2: 1848
Time for range3: 8411
Time for range4: 3487
我不明白爲什麼3時間超過4長,同時需要1小於2。此外,似乎映射功能是非常低效的;它有什麼用處?
function range0(start, count) {
var arr = [];
for (var i = 0; i < count; i++) {
arr.push(start + i);
}
return arr;
}
function range1(start, count) {
var arr = new Array(count);
for (var i = 0; i < count; i++) {
arr[i] = start + i;
}
return arr;
}
function range2(start, count) {
var arr = Array.apply(0, Array(count));
for (var i = 0; i < count; i++) {
arr[i] = start + i;
}
return arr;
}
function range3(start, count) {
var arr = new Array(count);
return arr.map(function(element, index) {
return index + start;
});
}
function range4(start, count) {
var arr = Array.apply(0, Array(count));
return arr.map(function(element, index) {
return index + start;
});
}
function profile(range) {
var iterations = 100000,
start = 0, count = 1000,
startTime, endTime, finalTime;
startTime = performance.now();
for (var i = 0; i < iterations; ++i) {
range(start, count);
}
endTime = performance.now();
finalTime = (endTime - startTime);
console.log(range.name + ': ' + finalTime + ' ms');
}
[range0, range1, range2, range3, range4].forEach(profile);
現代引擎對預分配的同類陣列進行了優化,因此可能會解釋'range1'。 – 2016-05-31 23:39:24
'.map()'存在以接收現有數組並使用潛在的複雜邏輯創建一個具有相同長度的新長度,以確定基於當前成員的每個成員的值。這是一個非常方便的方法。 – 2016-05-31 23:41:10
因爲.map()有它自己的工作,因爲'var arr = Array.apply(0,Array(count))'是一個非常醜陋的JS指令.. – Redu