Perlの m// は中身が固定文字列だと爆速になる
[追記]
実際に検証してみると、パターンが短いと index()
のほう速いこともあるようです。パターンが長いと正規表現のほうが高速になるのでそもそもアルゴリズムが違うようですね。
よってこのエントリの内容は必ずしも正確ではありません!
cf. https://gist.github.com/kazuho/5410635
[/追記]
Perlの話題を日本語で – Lingr で出た話題です。
Perlの正規表現マッチはパターンが単純だと index()
とおなじく Boyer-Moorアルゴリズムで検索するので非常に高速です。要は最適化のつもりでパターンマッチをindex()
に書き換えるのは無意味なのです。
ソースは pp.c
や regexec.c
あたりを fbm_instr()
で検索かな? ドキュメントもどこかで読んだ気がするのですが思い出せず><
perl -MDevel::Peek -e 'my $r = qr/foo/; my $x = qr/(?:bar)?[a-zA-z]?/; Dump $r; Dump $x'
とかで比べると固定文字列の有無で正規表現オブジェクトのフラグがだいぶ変わるのが見て取れますが、詳しいことはよく知らないのであとで暇な時に調べるかも。