switchとifの速度を比べてみた

第2回 Firebugによるデバッグの基本,Console APIとその活用:Firefox 3とFirebugで始めるJavaScript開発|gihyo.jp … 技術評論社にてプロファイルのとり方が載っていたので試した。


中核は以下のもの。switchが速いのは比較が == じゃなくて === を使っているからだという話がDeLLa.JSの方で出ていたので、ifは2バージョン作って試す。

console.profile();

function Switch() {
    var a = [0, 0, 0, 0, 0, 0, 0];
    var tmp;
    for(var i = 0; i < 1000; i++) {
        tmp = i % 7;
        switch(tmp) {
        case 0:
            a[0]++; break;
        case 1:
            a[1]++; break;
        case 2:
            a[2]++; break;
        case 3:
            a[3]++; break;
        case 4:
            a[4]++; break;
        case 5:
            a[5]++; break;
        default: // case 6
            a[6]++;
        }
        console.count();
    }
}

function If() {
    var a = [0, 0, 0, 0, 0, 0, 0];
    var tmp;
    for(var i = 0; i < 1000; i++) {
        tmp = i % 7;
        if(tmp == 0)      a[0]++;
        else if(tmp == 1) a[1]++;
        else if(tmp == 2) a[2]++;
        else if(tmp == 3) a[3]++;
        else if(tmp == 4) a[4]++;
        else if(tmp == 5) a[5]++;
        else              a[6]++;
        console.count();
    }
}

function If2() {
    var a = [0, 0, 0, 0, 0, 0, 0];
    var tmp;
    for(var i = 0; i < 1000; i++) {
        tmp = i % 7;
        if(tmp === 0)      a[0]++;
        else if(tmp === 1) a[1]++;
        else if(tmp === 2) a[2]++;
        else if(tmp === 3) a[3]++;
        else if(tmp === 4) a[4]++;
        else if(tmp === 5) a[5]++;
        else               a[6]++;
        console.count();
    }
}

for(var i = 0; i < 10; i++) {
    Switch();
    If();
    If2();
}
console.profileEnd();


結果は以下のようになった。

Function Calls Percent Own Time Time Avg Min Max
If 10 46.27% 1249.23ms 1249.398ms 124.94ms 70.098ms 563.859ms
If2 10 27.12% 732.247ms 732.41ms 73.241ms 71.225ms 74.75ms
Switch 10 26.62% 718.656ms 718.822ms 71.882ms 69.265ms 74.165ms

やはりSwitchが一番速い。が、===の方のifと明らかな差は無かった。jumpの回数が減るからswitchは速いという訳でもないらしい。


そういえば、プロファイルをとろうしたとき詳細は分からないけどローカルのファイルでは駄目だった。設定かなにかでどうにかはなるのかもしれない。仕方が無いのでNiftyの方にアップして実行している。ファイルはhttp://kokosabu.way-nifty.com/test/switch.htmlなので、良かったら自分でもやっていただければと思う。