正規表現ベンチ

http://www.ketan.jp/diary/
ベンチマークの目的は、ちゃんと良いエンジンを持ってるかどうかだと思うのだけど、どう考えてもPerlさんが苦手なloopによる文字列生成に時間がかかっているので、書きなおしてあげるべきだと思った。

use strict;
my $query = "b" x (1024*1024) . "x";
if ($query =~ /^b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b$/) {
    print "yes\n";
}
else {
    print "no\n";
}
__END__

実行時間は

real    0m0.008s
user    0m0.004s
sys     0m0.004s

元のだと、

real    0m0.272s
user    0m0.268s
sys     0m0.000s

うわぁ・・・・・
正規表現で、オートマトンをたどる時間よりも遅いんすか・・・ループって。

試しに、こんなのもやってみた。

use strict;


for (my $i = 0; $i < 1024*1024; ++$i) {
}
my $query = "b" x (1024*1024) . 'x';

if ($query =~ /^b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b$/) {
    print "yes\n";
}
else {
    print "no\n";
}
real    0m0.107s
user    0m0.100s
sys     0m0.008s

うわあ・・・・・・