from
JSEnumeratorいまさらながらldr(malaさん)のコードをちょっと見て感動。
JSのforeachの実装ですが、先に全実行回数の内8で割り切れない
端数の回数を一回ずつ実行し、その後loopを8回ずつ一気に実行。
(8はビット演算で計算しやすい適当な数ってことか)
function foreach(a,f){
var c = 0;
var len = a.length; //全実行回数
var i = len % 8; //8で割った端数を取得
if (i>0) do { //端数を実行
f(a[c],c++,a);
} while (--i);
i = parseInt(len >> 3);//ビット演算子を使って割る8
if (i>0) do { //8回一気に実行
f(a[c],c++,a);f(a[c],c++,a);
f(a[c],c++,a);f(a[c],c++,a);
f(a[c],c++,a);f(a[c],c++,a);
f(a[c],c++,a);f(a[c],c++,a);
} while (--i);
};
(コメント追加)
たとえば、22回実行するなら、最初1回ずつの実行を6回行い、
その後8回実行を2回行う。
見つけた元
http://coderepos.org/share/changeset/8126
ベンチマークの話
http://d.hatena.ne.jp/os0x/20080310/1205154454
ldr foreachの元ねた?のブクマ(リンク先消失)
http://b.hatena.ne.jp/entry/2100562
元はprototype.jsの.eachを3倍早くするって内容だったらしい。