SmallStyle


2006-06-15

_ パイプを使った正規表現は遅いらしい

qootas.org/blog - perl regex performance で,

"|"(パイプ)を使った正規表現はめちゃくちゃ遅いから使わないように、ということです。確かにベンチマークを取ると32倍速いです。

とのことだったので,Ruby ではどうだろうと試してみた.

#!/usr/bin/env ruby
require 'benchmark'

text = ';lskjdf;klvckxv;zijxcv;oa;vlkaefiuqewizlkvnzlxkcnv'
text << '.z,xmc v/z.x,cmv.z,xnvlafda isjdnfl aksjdfauerfaie'
text << 'jnlfakjdsn;akj;v akjdfvoaijdhfvoiaheriufahpsdiufhaeuhr'
text << ' iuahriufhairuhfapsidfalksjfhaiuphrofiankfjas;dofha[s9'
text << 'hfskjdf;ase;f,sedhfaiuwhefs,dnvflk dfis fapoisf fqjr'

n = 500000

Benchmark.bm(10) do |x|
   x.report("00_pipe:")    { n.times do ; /abc|def|ghi/ =~ text; end }
   x.report("01_nopipe:")  { n.times do ; /abc/ =~ text or /def/ =~ text or /ghi/ =~ text; end }
end
$ ruby regex.rb
                user     system      total        real
00_pipe:   15.703000   0.000000  15.703000 ( 15.735000)
01_nopipe:  3.297000   0.000000   3.297000 (  3.297000)

Ruby でも同様にパイプを使わない方が速いですね.4 倍以上といったところ.perl ほどの差は出なかったけど.極力使わないように気をつけよう.


about me

いろいろと興味を持ったことを書いてます.ちょっとしたことは hb(@smallstyle) on Twitter で書いてます.

Archive

2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|12|