我想了解构造数组的性能差异。运行下面的程序,我对下面的输出不解:创建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