Какой самый быстрый способ проверить, совпадают ли две строки или RegExp точно? - PullRequest
0 голосов
/ 02 марта 2012

Какой самый быстрый способ (на уровне символов) при проверке, точно ли совпадают две строки или RegExp?Если строка очень длинная или нужно проверять много раз?

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

  2. str[str_or_regexp] == str

Или есть лучший способ?

Мы не знаем, str_or_regexp является строкой или регулярным выражением до времени выполнения.

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Когда ничего не помогает, запустите несколько тестов:

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

В этом случае ваш первый метод оказался намного хуже для регулярных выражений, но второй был примерно таким же.

Как я уже сказал, просто запустите некоторые тесты на реальных данных и посмотрите, что произойдет.

0 голосов
/ 02 марта 2012

Я предпочитаю string.match(pattern) сам, и это, кажется, предложенный метод.Вот основные документы для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...