眾所周知,過多的循環(huán)會(huì)帶來一定的性能開銷,增加總體運(yùn)行時(shí)間。而減少迭代次數(shù)能夠優(yōu)化性能。"Duff's Device" 作為廣為人知的一種限制循環(huán)迭代次數(shù)的模式,還是有必要了解的。
Duff's Device 原本是 C 語言中的實(shí)現(xiàn)方式,不過由 Jeff Greenberg 移植到 JavaScript 中,下面是一個(gè)典型的實(shí)現(xiàn):
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);
代碼的思路是非常的清晰的,那就是每次循環(huán)都執(zhí)行八次函數(shù),這樣很明顯會(huì)減少迭代的次數(shù)。不過,只有在迭代次數(shù)比較多時(shí),才能夠有明顯的效率提升。
此算法稍快的版本取消了 switch 語句,而且余數(shù)處理和主循環(huán)分開:
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--]);
}
其實(shí)整個(gè)實(shí)現(xiàn)的過程并不復(fù)雜,不過為什么 Duff's Device 每次迭代都是執(zhí)行 8 次函數(shù)?