众所周知,过多的循环会带来一定的性能开销,增加总体运行时间。而减少迭代次数能够优化性能。”Duff’s Device” 作为广为人知的一种限制循环迭代次数的模式,还是有必要了解的。
下面贴出了几个js版本的Duff's Device实现方式
function duff(items) {
var len = items.length, //缓存局部变量
iterations = Math.floor(len / 8), //商数,存放duff迭代次数
startAt = len % 8, //余数,存放duff一次迭代调用process的次数
i = 0;
do {
switch (startAt) {
case 0:
process(items[i++]);
case 7:
process(items[i++]);
case 6:
process(items[i++]);
case 5:
process(items[i++]);
case 4:
process(items[i++]);
case 3:
process(items[i++]);
case 2:
process(items[i++]);
case 1:
process(items[i++]);
}
startAt = 0;
} while (iterations--); //书上是--iterations,貌似不对吧,应该是iterations--
};
function duff2(items) {
let len = items.length;
let count = Math.floor(len / 8);
let start = len % 8;
let i = 0;
while (start--) {
// do something
//第一次跑余数个process
process(items[i++]);
}
while (count--) {
// do something,
//后面每次跑8个process
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
process(items[i++]);
}
};
function duff3(items) {
var iterations = items.length % 8,
i = items.length - 1;
while(iterations){
// do something
//第一次跑余数个process
process(items[i--]);
iterations--;
}
iterations = Math.floor(items.length / 8);
while(iterations){
// do something,
//后面每次跑8个process
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
iterations--;
}
}
function process(item) {
console.log(item)
}
// duff([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
duff2([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
// duff3([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])