大文字小文字を区別しない文字列検索は正規表現でやると良い。

関数を作成中にちょっと疑問に思ったんで調べてみました。JavaScriptの文字列検索系関数を比較するのに以下のコードで実験。

function keisoku(name, func, a, b){
    var ave=null;
    for(var i=0;i<b;i++){
        var start_time=new Date().getTime();
        for(var j=0;j<a;j++) func();
        var exec_time =new Date().getTime()-start_time;
        if(ave===null) ave=exec_time;
        else ave=(ave+exec_time)/2;
    }
    console.log("計測結果 "+ave+" ms "+name);
}

var text = window._content.document.body.textContent;
keisoku("String#indexOf()",function(){ text.toLowerCase().indexOf("test"); },1000,100);
keisoku("String#match()"  ,function(){ text.match(/test/i);                },1000,100);
keisoku("String#search()" ,function(){ text.search(/test/i);               },1000,100);

結果は以下のようになりました。

計測結果 8.500487091679455 ms String#indexOf()
計測結果 7.9843730889188 ms String#match()
計測結果 7.491935237296046 ms String#search()
※(環境はFirefox2.0.0.2,MacOSX 10.4.9)

まぁ、予想通り毎回String#toLowerCase()で変換してるし正規表現の方が早い。ちなみにString#toLowerCase()を使わない場合は早くなったが、正規表現系の大文字小文字を区別しない正規表現よりすこし早いだけだった。

String#toLowerCase()を使わなかった結果。
計測結果 5.0313112745098465 ms String#indexOf()

とりあえずゴリゴリ作ってる最中は、正規表現の文字列検索すればシアワセになれそうです。