当循环次数是确定的,消除循环并使用多次函数调用往往更快
let arr = new Array(99999999);
function loop1 () {
console.time('timer');
let j = 0;
for (let i = 0; i < arr.length; i++) {
j = j + 1;
}
console.timeEnd('timer');
}
// 一次循环运行8次函数,循环次数约为原来的 1/8
function loop2 () {
console.time('timer');
let j = 0;
let iter = Math.ceil(arr.length / 8);
let startChar = arr.length % 8
do {
switch (startChar) {
case 0: j = j + 1;
case 7: j = j + 1;
case 6: j = j + 1;
case 5: j = j + 1;
case 4: j = j + 1;
case 3: j = j + 1;
case 2: j = j + 1;
case 1: j = j + 1;
}
startChar = 0;
} while (--iter > 0)
console.timeEnd('timer');
}
运行几次loop1()
及loop2()
,发现loop1()
运行时间为100ms左右,而优化之后loop2()
运行时间位40ms左右,时间减少了将近一半多

参考 《Javascript高级程序设计》(第3版) P691