By rubiojr on December 6, 2008
Interesantes números midiendo el rendimiento de los diferentes ‘motores’ de expresiones regulares que hay en ruby.
Las pruebas se han hecho analizando un fichero de 1 millón de líneas de log de apache.
ruby1.8.7
require 'benchmark'
logfile = '/data/logs/httpd/old/1m'
fields = [
'(\d+\.\d+\.\d+\.\d+)', # ip
'(.*?)', # ident
'(.*?)', # user
'\[(.*?)\]', # datetime
'"(.*?)"', # request
'(\d+)', # code
'(-|\d+)', # size
'"(.*?)"', # referer
'"(.*?)"', # user-agent
'\[(.*?)\]' # vhost
]
re = "^#{fields.join('\s+')}$"
regex = /#{re}/
Benchmark.bm do |x|
3.times do
x.report {
File.open logfile do |f|
f.each_line do |l|
regex.match(l)
end
end
}
end
end
rubiojr@desire:~/lparse_bench$ ruby ruby_regex.rb
user system total real
42.820000 0.430000 43.250000 ( 43.578923)
42.640000 0.520000 43.160000 ( 43.495074)
42.780000 0.540000 43.320000 ( 43.369753)
———————–
ruby1.9.1 r19983 (ejecutando el mísmo código de arriba)
rubiojr@desire:~/lparse_bench$ /opt/ruby1.9/bin/ruby ruby_regex.rb
user system total real
13.200000 0.150000 13.350000 ( 13.357268)
13.190000 0.180000 13.370000 ( 13.401657)
13.220000 0.120000 13.340000 ( 13.333555)
———————–
ruby1.8.7 + oniguruma
require 'rubygems'
require 'oniguruma'
require 'benchmark'
logfile = '/data/logs/httpd/old/1m'
fields = [
'(\d+\.\d+\.\d+\.\d+)', # ip
'(.*?)', # ident
'(.*?)', # user
'\[(.*?)\]', # datetime
'"(.*?)"', # request
'(\d+)', # code
'(-|\d+)', # size
'"(.*?)"', # referer
'"(.*?)"', # user-agent
'\[(.*?)\]' # vhost
]
re = "^#{fields.join('\s+')}$"
regex = Oniguruma::ORegexp.new(re)
Benchmark.bm do |x|
3.times do
x.report {
File.open logfile do |f|
f.each_line do |l|
regex.match(l)
end
end
}
end
end
rubiojr@desire:~/lparse_bench$ ruby oniguruma_regex.rb
user system total real
12.500000 0.570000 13.070000 ( 13.146782)
12.520000 0.600000 13.120000 ( 13.242722)
12.470000 0.530000 13.000000 ( 13.010874)
Oniguruma forma parte de ruby1.9, lo que parece que explica la similitud de los resultados obtenidos con ruby1.8+oniguruma y ruby1.9.1.
Está claro que el motor de ruby1.8 no es el candidato ideal para el
WayFinder Project :D
Update: jruby1.1.6 RC1 (IcedTea6 1.3.1)
rubiojr@desire:~/lparse_bench$ jruby ruby_regex.rb
user system total real
17.260000 0.220000 17.480000 ( 18.085660)
16.430000 0.160000 16.590000 ( 16.888714)
16.240000 0.220000 16.460000 ( 16.728076)
JRuby 1.1 incluye un port de Oniguruma a Java, de acuerdo con las “
release notes“
Posted in In the LAB, Scripts | Tagged ruby regex |