gotin blog

Whatever gotin wanna write

javascriptで正規表現使うとき、RegExpのインスタンスを前もって作っておくってことをしてもしなくても大差なさそう、Firefoxの場合。

with(DEF()){
  function reg1(str){
    str.replace(/abc/g, "");
  }

  var regexp = new RegExp("abc", "g")
  function reg2(str){
    str.replace(regexp, "");
  }

  function test(){
    var TIMES= 100000;
    var timer = new Timer();
    var target = "abcabcabcabc";
    timer.start();
    for(var i=0;i<TIMES;i++){
      reg1(target);
    }
    timer.stop();
    timer.start();
    for(var i=0;i<TIMES;i++){
      reg2(target);
    }
    timer.stop();
    return timer.times;
  }

  print(test()); // 結果:2091, 2138  とか 2338, 2156 とか 2143, 2182
                 // つまり大差ない。
                 // なんならRegExpを前もって作る方が遅い結果が出ちゃうぐらいの差。
                 // RegExpを前もって作っておくのは、
                 // 複数行に同じものを書く必要があってミスを防ぐためぐらいにしておいて、
                 // 実行効率を考えてループ前に定義しておく、
                 // なんて気を使うことはしなくてもよさそうだね。
                 // ってことであってるのかな。あんまり自信はないけど。
                 // きっと処理系によって全然違うんだろうな。
}

function DEF(){
  function Timer(){}
  Timer.prototype = {
    index:0,
    times:[],
    start:function(i){
      this.times[this.index] = new Date().getTime();
    },
    stop:function(i){
      var time = new Date().getTime();
      var s = this.times[this.index];
      this.times[this.index] =  time - s;
      this.index++;
    }
  };
  return {Timer:Timer};
}

もっと複雑な正規表現にしたらかわってくるかな。いや、多分かわらないだろうな。

多分

これって正規表現リテラルの処理の最適化が行われているんだろうなと予想。
グローバル変数を参照してるのと同じ速度が出るような内部処理がされてるんじゃないかなぁと。
その真実を探るにはjavascriptエンジンの実装を読むしかないかな。。。