摘自:《javascript 高级程序设计》第三版。在数据量很大的时候,为for循环提速。。。 原来的写法:for(var i=0;i<arr.length;i++){ process(i); //循环体处理 } 原duff装置技术写法: // 因为是改写成的是do while形式(do while循环中循环体至少执行一个回合),所以循环必须满足的前提条件 :执行次数大于0次
var times= Math.ceil(arr.length/8); var starAt= arr.length/8; var i=0; do{ switch(starAt ){ case 0: process(arr[i++]); case 7: process(arr[i++]); case 6: process(arr[i++]); case 5: process(arr[i++]); case 4: process(arr[i++]); case 3: process(arr[i++]); case 2: process(arr[i++]); case 1: process(arr[i++]); } startAt=0; } while(--times >0); 改进后的duff装置技术写法: // 因为是改写成的是do while形式,所以循环必须满足的前提条件:执行次数大于等于8次 var times= Math.floor(arr.length/8); var leftover= arr.length/8; var i=0; //结构1 if(leftover>0){ do{ process(arr[i++]); }while(--leftover>0); } //结构1完 //结构2 do{ process(arr[i++]); process(arr[i++]); process(arr[i++]); process(arr[i++]); process(arr[i++]); process(arr[i++]); process(arr[i++]); process(arr[i++]); } while(--times >0); //结构2 据说改进后的技术速度提高4层。比起原来for循环体的速度快多少,很多很多吧,数据量越大,越会体现它的速度。。 快是因为循环判断(i<arr.length)累计时间是循环主要消耗时间的地方,而duff 的写法则将循环展开,判断次数降低。(个人意见)
上面代码采用javascript语法,其他语言做相应修改。