检查两个字符串或RegExp是否完全匹配时,哪种方法更快?

时间:2012-03-02 02:45:36

标签: ruby string

检查两个字符串或RegExp是否完全匹配时,哪种方法更快(在字符级别)?如果字符串非常长或需要多次检查?

  1. str == str_or_regexp || str =~ str_or_regexp

  2. str[str_or_regexp] == str

  3. 还是有更好的方法?

    我们不知道str_or_regexp是字符串或正则表达式,直到运行时。

2 个答案:

答案 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