JavaScript反復最適化(Duff's Device)

1214 ワード

多すぎるサイクルは、一定の性能オーバーヘッドをもたらし、全体の運転時間を増やすことが知られている.反復回数を減らすことは性能を最適化することができる.「Duff's Device」はよく知られているサイクルの反復回数を制限するモデルとして、やはり知る必要があります.
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回の関数を実行しますか?