正規表現でパイプを使うと遅くなる件
http://qootas.org/blog/archives/2006/06/perl_regex_perf.html
正規表現でパイプ("|")を使うとめちゃくちゃ遅くなるってことだけどこれって程度によるみたいね。
「コレかコレかコレにマッチする」みたいな正規表現を書くときにパイプ使うのがダメであって、ちょっとでも複雑な正規表現になるとパイプ使っても使わなくても大差無いっぽい。
ってか試してみたらむしろ遅くなった。
# コードは元記事のやつを拝借させてもらいました。 use Benchmark; my $text = ';lskjdf;klvckxv;zijxcv;oa;vlkaefiuqewizlkvnzlxkcnv' . '.z,xmc v/z.x,cmv.z,xnvlafda isjdnfl aksjdfauerfaie' . 'jnlfakjdsn;akj;v akjdfvoaijdhfvoiaheriufahpsdiufhaeuhr' . ' iuahriufhairuhfapsidfalksjfhaiuphrofiankfjas;dofha[s9' . 'hfskjdf;ase;f,sedhfaiuwhefs,dnvflk dfis fapoisf fqjr'; my $count = 500_000; timethese($count, { '00_pipe' => sub { $text =~ m/a(?:abc|def|ghi)b+/ }, '01_nopipe' => sub { $text =~ m/aabcb+/ or $text =~ m/adefb+/ or $text =~ m/aghib+/ }, }); __END__ $ perl regex.pl Benchmark: timing 500000 iterations of 00_pipe, 01_nopipe ... 00_pipe: 1 wallclock secs ( 0.36 usr + 0.00 sys = 0.36 CPU) @ 1381215.47/s (n=500000) 01_nopipe: 0 wallclock secs ( 0.73 usr + 0.00 sys = 0.73 CPU) @ 683060.11/s (n=500000)
ま、当然か。
というわけでパイプ使うときは慎重に。