「正規表現:悪い表現、いい表現、最良の表現」のRubyベンチマーク

More than 3 years have passed since last update.

POSTDに「正規表現:悪い表現、いい表現、最良の表現」という記事が上がっていたので、興味本位でRubyでベンチマークとってみた。

http://postd.cc/regexes-the-bad-the-better-and-the-best/


スペック

  Model Name: Mac mini

Model Identifier: Macmini5,1
Processor Name: Intel Core i5
Processor Speed: 2.3 GHz
Number of Processors: 1
Total Number of Cores: 2
L2 Cache (per Core): 256 KB
L3 Cache: 3 MB
Memory: 8 GB

$ ruby -v

ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin13]


コード


regexp.rb

#!/usr/bin/env ruby

require 'benchmark'

t = '2014-08-26 app[web.1]: 50.0.134.125 - - [26/Aug/2014 00:27:41] "GET / HTTP/1.1" 200 14 0.0005'

rp1 = Regexp.new('.* (.*)\[(.*)\]:.*') # 悪い正規表現
rp2 = Regexp.new('[12]\d{3}-[01]\d-[0-3]\d (.*)\[(.*)\]:.*') # いい正規表現
rp3 = Regexp.new('[12]\d{3}-[01]\d-[0-3]\d ([^ \[]*?)\[([^\]]*?)\]:.*') # 最良の正規表現

n = 1000000
Benchmark.bm 6 do |x|
x.report('bad:') { n.times do rp1 =~ t end }
x.report('better:') { n.times do rp2 =~ t end }
x.report('best:') { n.times do rp3 =~ t end }
end



結果

             user     system      total        real

bad: 14.310000 0.020000 14.330000 ( 14.342206)
better: 4.590000 0.000000 4.590000 ( 4.597231)
best: 1.890000 0.000000 1.890000 ( 1.894905)

と、案の定最良の正規表現が一番速いという結果になった


結論

最良の正規表現を書こう