最近閱讀《高性能JavaScript》時,在書中的“達夫設備“ 。 對此,有些感悟,同時有些疑問,希望看到的朋友,能幫忙解釋下,在此先提前感謝了。 1. 先說自己的理解吧: ”達夫設備“的目的是減少迭代次數,提高迴圈的效率,減少時間,提升性能。 感受:感覺代碼的優化,真的需要用工匠精神來雕琢,代碼的 ...
最近閱讀《高性能JavaScript》時,在書中的“達夫設備“ 。
對此,有些感悟,同時有些疑問,希望看到的朋友,能幫忙解釋下,在此先提前感謝了。
1. 先說自己的理解吧:
”達夫設備“的目的是減少迭代次數,提高迴圈的效率,減少時間,提升性能。
感受:感覺代碼的優化,真的需要用工匠精神來雕琢,代碼的思想很好,也很巧妙。
原文的意思:是否值得使用達夫設備,無論是原始的版本還是修改後的版本,很大程度上依賴於迭代的次數。如果循
環迭代次數少於 1'000 次,你可能只看到它與普通迴圈相比只有微不足道的性能提升。如果迭代次數超過
1'000 次,達夫設備的效率將明顯提升。例如 500'000 次迭代中,運行時間比普通迴圈減少到 70%。
2. 自己在代碼中遇到的問題:
(1)原文代碼:
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)
原文說:達夫設備背後的基本理念是:每次迴圈中最多可 8 次調用 process()函數。迴圈迭代次數為元素總數除以
8。因為總數不一定是 8 的整數倍, 所以 startAt 變數存放餘數, 指出第一次迴圈中應當執行多少次 process()。
比方說現在有 12 個元素,那麼第一次迴圈將調用 process()4 次,第二次迴圈調用 process()8 次,用 2 次循
環代替了 12 次迴圈。
(2) 遇到的問題:
自己模擬12次迴圈時,遇到的了問題。
var items = ['a','b','c','d','e','f','g','h','i','j','k','l'];
var iterations = Math.floor(items.length / 8),
startAt = items.length % 8,
i = 0;
function process(v){
console.log(v);
}
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);
執行結果:只執行了4次,後面的8次沒有遍歷。
自己覺得,應該把“iterations--” 改成 ”iterations--“
修改後代碼:
var items = ['a','b','c','d','e','f','g','h','i','j','k','l'];
var iterations = Math.floor(items.length / 8),
startAt = items.length % 8,
i = 0;
function process(v){
console.log(v);
}
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--);
運行結果:
不知是我自己的測試案例有問題,還是書中寫的有問題。望遇到相同問題的朋友,共同探討。在此先感謝了。