2011-01-23 35 views
1

我有一个字符串,我想映射到一个整数。许多字符串可以映射到相同的整数,所以我使用正则表达式来匹配应映射到相同整数的字符串。在Ruby中正则表达式中加入正则表达式的速度更快?

实施例:

str = "hello" 

REGEXES.each do |key, val| 
    if str =~ key 
    print val 
    end 
end 

其中正则表达式是正则表达式映射到整数的散列。

哪个更好:

REGEXES = [/hello/ => 2, /foo/ => 2, /bar/ => 3] 

REGEXES = [/(hello|foo)/ => 2, /bar/ => 3] 
+0

你是什么意思的“更好”(从哪个角度来看)。那些是真正的正规表达式,还是比这更复杂? – ircmaxell 2011-01-23 01:13:10

回答

1

Benchmark是你的朋友:

require 'benchmark' 

str = 'hello' 
num = 1000000 

Benchmark.bmbm do |x| 
    x.report('individual keys:') do 
    regexes = [/hello/ => 2, /foo/ => 2, /bar/ => 3] 

    num.times do 
     regexes.each {|key, val| str =~ key} 
    end 
    end 

    x.report('combined keys: ') do 
    regexes = [/(hello|foo)/ => 2, /bar/ => 3] 

    num.times do 
     regexes.each {|key, val| str =~ key} 
    end 
    end 
end 

结果:

Rehearsal ---------------------------------------------------- 
individual keys:   1.600000   0.010000   1.610000 ( 1.780246) 
combined keys:     1.610000   0.010000   1.620000 ( 1.761067) 
------------------------------------------- total: 3.230000sec 

                       user     system      total        real 
individual keys:   1.570000   0.000000   1.570000 ( 1.589879) 
combined keys:     1.590000   0.010000   1.600000 ( 1.678724) 

正如你所看到的,在这种情况下,没有太大的区别。

我建议你用完整的正则表达式/整数散列来试一试,看看它们之间的差异是否更显着。如果有的话,那就是你的答案。如果没有,你可以随意使用任何更有意义的。

0

我会去第二个版本,因为它会减少循环次数。如果映射到同一个int的值过多,则可以将它们分散到单独的散列元素中。