日本語含む正規表現が遅いときがあるよ
こんな現象見つけた。
use utf8; use Time::HiRes; use Benchmark qw(:all :hireswallclock); sub five { my $a = 'あいうえお'; my $b = 'あれれ'; ($b =~ /^\s*$a\s*$/) ? 1 : 0; } sub three { my $a = 'あいう'; my $b = 'あれれ'; ($b =~ /^\s*$a\s*$/) ? 1 : 0; } my $res = timethese(10, { five => \&five, three => \&three, }); cmpthese($res);
まあベンチマークとるまでもなく体感で違うんですが、手元のCentOSでの結果。
Benchmark: timing 10 iterations of five, three... five: 21.6958 wallclock secs (21.69 usr + 0.00 sys = 21.69 CPU) @ 0.46/s (n=10) three: 5.07832e-05 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count) s/iter five three five 2.17 -- -100% three 1.00e-16 2168999999999999744% --
わーい。つまりひらがな5文字にすると2秒ぐらい掛るように。これ1文字足したり引いたりいろいろすると1秒以下になったりします。微妙なとこでプランが変わるような感触。
Perlは5.8.8、関係あるのかどうかEncodeは2.18。
これ、既知のアレなのかな。
まあ、このコードの場合先に$bの先頭末尾から空白文字を削ってeqで比べたほうがいい、ということでいいんですが、ちょっとなにやら不穏な気配がしたもので。日本語含みの場合気をつけなきゃいけないってこと?
正規表現先頭の「^\s*」が怪しいのかな。
encode_utf8してから比べるようにすることでも回避できるようですが…あまりやりたくないなあ。