更快地在Ruby的正则表达式哈希中整合正则表达式?

时间:2011-01-23 01:05:13

标签: ruby regex string

我有一个我要映射到整数的字符串。许多字符串可以映射到相同的整数,因此我使用正则表达式匹配应映射到同一整数的字符串。

示例:

str = "hello"

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

其中REGEXES是将正则表达式映射为整数的哈希值。

哪个更好:

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

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

2 个答案:

答案 0 :(得分: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)

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

我建议您使用完整的正则表达式/整数哈希值进行尝试,看看差异是否更显着。如果有的话,那就是你的答案。如果没有,你可以随意使用任何更有意义的东西。

答案 1 :(得分:0)

我会使用第二个版本,因为它会减少循环周期数。如果有太多的值映射到同一个int,你可以将它们拆分为单独的哈希元素。