http://qootas.org/blog/archives/2006/06/perl_regex_perf.html



をブクマしてるid:naoyaさんのコメント



[perl] あらま、意外。 o つけたら変わるかなとおもったけど同じでした。








/hoge/oは、正規表現に変数が入ってる場合のみに違いがでてくるはず。例えば



my $re = "hoge";
$str =~ /$re/ for (1..100)

よりかは



my $re = "hoge";
$str =~ /$re/o for (1..100)

のほうが早い。以下ベンチマーク:



use strict;
use Benchmark qw(cmpthese);

my $str = "foobarbaz" x 100;
my $re = "bar";

sub with_o
{
$str =~ /$re/og;
}

sub without_o
{
$str =~ /$re/g;
}

cmpthese(1_000_000, {
with_o => \&with_o,
without_o => \&without_o
});

daisuke@beefcake daisuke$ perl benchmark/regexp_o.pl
Rate without_o with_o
without_o 1369863/s -- -15%
with_o 1612903/s 18% --
daisuke@beefcake daisuke$

ちなみに/$re/gを/bar/gにすると



daisuke@beefcake daisuke$ perl benchmark/regexp_o.pl
Rate with_o without_o
with_o 1612903/s -- -16%
without_o 1923077/s 19% --
daisuke@beefcake daisuke$ vi benchmark/regexp_o.pl

あっさり逆転。ちなみにネタもとの|に関しては、|があるとバックトラックをしなくちゃいけないのでその分だけ処理が増えるので遅いのは当然。