达夫设备 duff's device 勘误
之前阅读O'Reilly出版的《High Performance JavaScript》(猫头鹰书),发现其中错误真是不少。其中,讲到优化迭代次数的Duff's device方法,原版代码和优化版代码居然都出错!!害得我陷入死循环...
上网搜了搜,看到不少同学发现了错误,但是更多的人只是把源代码转发,并未纠正其错误,唏嘘不已。以后看书,还是要亲手运行代码,且同时看看勘误表吧~
原版:
//credit: Jeff Greenberg 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);
原版勘误
The last line of the example code is: } while(--iterations); It should be changed to: } while(iterations--);
//credit: Jeff Greenberg 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--]); }
优化版勘误:
The first code example on page 67 should be: //credit: Jeff Greenburg var iterations = items.length % 8, i = items.length - 1; while(iterations){ process(items[i--]); iterations--; } iterations = Math.floor(items.length / 8); while(iterations){ 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--; }