循环体在程序的执行过程中是一个开销非常大的操作,有效的优化可以很好的提升性能。循环性能的优化可以通过减少循环次数和降低每次循环的开销两方面入手。对于降低每次循环开销,可以使用局部变量缓存一些需要经常查询的类型,比如数组长度等;关于减小循环次数,可以使用Duff’s Device。
Duff’s Device即达夫设备,是一种通过展开循环体从而限制循环迭代次数的方法,其实质是在一次迭代中执行了原循环的多次循环操作,一般最多每次等效循环可以代替8次循环。Jeff Greenberg将Duff’s Device从C语言引入到了JavaScript中。其具体实现如下:
//credit: Jeff Greenberg
//平均运行时间约为2s
var items = Array(10000001).join(1).split('');
function process(arr,i) {
arr[i] *= 2;
}
var len = items.length;
startAt = len % 8,
iterations = Math.ceil(len / 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);
当迭代次数超过1000时,Duff’s Device的执行效率可以明显提升。