检查两个字符串或RegExp是否完全匹配时,哪种方法更快(在字符级别)?如果字符串非常长或需要多次检查?
str == str_or_regexp || str =~ str_or_regexp
str[str_or_regexp] == str
还是有更好的方法?
我们不知道str_or_regexp
是字符串或正则表达式,直到运行时。
答案 0 :(得分:3)
当其他所有方法都失败时,请运行一些测试:
str = 'string'
s = 'string'
r = /string/
methods = {
:equals_or_matches => lambda { |t| str == t || str =~ t },
:square_brackets => lambda { |t| str[t] == str }
}
methods.each_pair do |name, method|
puts name
[s, r].each do |t|
puts t.class
5.times do
start = Time.now
1000000.times do
method.call(t)
end
puts Time.now - start
end
end
puts
end
我得到了这些结果:
equals_or_matches
String
0.942799
0.942405
0.944376
0.946296
0.93843
Regexp
1.916263
1.915058
1.913306
1.934423
1.932633
square_brackets
String
1.15087
1.157245
1.157863
1.174356
1.188758
Regexp
2.09721
2.103493
2.028035
2.025194
2.037734
这表明你的第一种方法比第二种方法快一点。
然而,如果字符串不相等且||
没有“短路”,您将获得TypeError
。您无法将字符串传递给=~
。所以你应该用str.match(t)
替换它,这给了我这些结果:
equals_or_matches
String
0.936063
0.94154
0.938561
0.934187
0.935868
Regexp
2.755815
2.75011
2.758374
2.761684
2.76826
square_brackets
String
1.198433
1.160929
1.354407
1.410265
1.274158
Regexp
2.013017
2.275579
2.297108
2.165399
2.125889
在这种情况下,你的第一种方法对于正则表达式更糟糕,但第二种方法大致相同。
就像我说的那样,只需对真实数据进行一些测试,看看会发生什么。
答案 1 :(得分:0)
我自己更喜欢string.match(pattern)
,这似乎是建议的方法。以下是core docs。