一个基本的for循环
for (let i = 0; i < values.length; i++) {
...
}
一个减值操作的for循环
for (let i = values.length - 1; i >= 0; i--) {
...
}
一个后测试循环
let i = values.length - 1;
if (i > -1) {
do {
...
} while(--i >= 0);
}
处理大数据时应该展开循环操作
当循环次数确定时,展开循环往往更快
当循环次数不确定时,可以采用Duff装置技术
传统Duff装置
// 假设values.length > 0
let iterations = Math.ceil(values.length / 8), // 向上取整技术循环次数
startAt = values.length % 8, // 取余,计算第一次循环执行次数
i = 0;
do {
// case没有break,所以会从匹配到的startAt开始向后会全部执行
switch(startAt) {
case 0:
process(values[i++]);
case 7:
...;
case 6:
...;
case 5:
...;
case 4:
...;
case 3:
...;
case 2:
...;
case 1:
...;
}
startAt = 0; // 初始化startAt,下一次循环会从case 0开始执行
} while (--iterations > 0);
更快的Duff装置
let iterations = Math.ceil(values.length / 8), // 向上取整技术循环次数
leftover = values.length % 8, // 取余,计算第一次循环执行次数
i = 0;
if (leftover > 0) {
do {
process(values[i++]);
} while (--leftover > 0)
}
do {
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
} while (--iterations > 0);