我有一个我要映射到整数的字符串。许多字符串可以映射到相同的整数,因此我使用正则表达式匹配应映射到同一整数的字符串。
示例:
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]
答案 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,你可以将它们拆分为单独的哈希元素。