Check

LDR each

| | コメント(0) | トラックバック(0)
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倍早くするって内容だったらしい。

トラックバック(0)

このブログ記事を参照しているブログ一覧: LDR each

このブログ記事に対するトラックバックURL: http://0-9.sakura.ne.jp/mt/mt-tb.cgi/324

コメントする