众所周知,过多的循环会带来一定的性能开销,增加总体运行时间。而减少迭代次数能够优化性能。"Duff's Device" 作为广为人知的一种限制循环迭代次数的模式,还是有必要了解的。
Duff's Device 原本是 C 语言中的实现方式,不过由 Jeff Greenberg 移植到 JavaScript 中,下面是一个典型的实现:
var iterations = Math.floor(items.length / 8),
startAt = items.length % 8,
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);
代码的思路是非常的清晰的,那就是每次循环都执行八次函数,这样很明显会减少迭代的次数。不过,只有在迭代次数比较多时,才能够有明显的效率提升。
此算法稍快的版本取消了 switch 语句,而且余数处理和主循环分开:
var i = items.length % 8;
while(i) {
process(items[i--]);
}
i = Math.floor(items.length / 8);
while(i) {
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
}
其实整个实现的过程并不复杂,不过为什么 Duff's Device 每次迭代都是执行 8 次函数?