latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

loop unwinding - ループ展開(先におまとめ, 後からおまとめ)

ループ展開使ってますか? 8の倍数でバルクループさせると、普通に回すより効率いいですよ?

定番のループ展開も

  1. 先にまとめてやる
  2. 後からまとめてやる

の2つの方法で記述する事ができます。

// loop unwinding type1 - 先にやる
function loop1(n) {
    var now = Date.now();

    var rv = [],
        i = 0, iz = n & 0xfffffff8;

    for (; i < iz; i += 8) {
//      rv.push(i, i+1, i+2, i+3, i+4, i+5, i+6, i+7);
    }
    for (; i < n; ++i) {
//      rv.push(i);
    }

    console.log(Date.now() - now);
}

// loop unwinding type2 - 後でやる
function loop2(n) {
    var now = Date.now();

    var rv = [],
        i = -1,
        iz = n,
        remain = iz % 8;

    while (remain--) {
//      rv.push(++i);
    }
    remain = iz >>> 3;
    while (remain--) {
//      rv.push(i+1, i+2, i+3, i+4, i+5, i+6, i+7, i+8);
        i += 8;
    }

    console.log(Date.now() - now);
}

速度的な差はほぼ無いので、変数が少ない loop1 のほうがお手軽ですね。