JavaScript反復最適化(Duff's Device)
1214 ワード
多すぎるサイクルは、一定の性能オーバーヘッドをもたらし、全体の運転時間を増やすことが知られている.反復回数を減らすことは性能を最適化することができる.「Duff's Device」はよく知られているサイクルの反復回数を制限するモデルとして、やはり知る必要があります.
Duff's DeviceはもともとC言語で実現されたものですが、Jeff GreenbergによってJavaScriptに移植されたもので、以下のような典型的な実現があります.
このアルゴリズムのやや速いバージョンはswitch文をキャンセルし、残りの処理とメインループは分離されます.
Duff's DeviceはもともとC言語で実現されたものですが、Jeff GreenbergによってJavaScriptに移植されたもので、以下のような典型的な実現があります.
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回の関数を実行することで、反復の回数を減らすことが明らかです.ただし、反復回数が多い場合にのみ、明らかな効率化が可能である.このアルゴリズムのやや速いバージョンはswitch文をキャンセルし、残りの処理とメインループは分離されます.
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--]);
}
実际には、全体のプロセスは复雑ではないが、なぜDuff's Deviceは毎回8回の関数を実行しますか?