Есть ли любое различие в скорости/использовании памяти для этих двух эквивалентных выражений:
Regex.IsMatch(Message, "1000")
По сравнению с
Message.Contains("1000")
Какие-либо ситуации, где каждый лучше, чем другой?
Контекст этого вопроса следующие: Я вносил некоторые изменения в унаследованный код, который содержал выражение Regex, чтобы найти, содержится ли строка в другой строке. Быть унаследованным кодом, который я не вносил изменениями в это и в коде, рассматривает кого-то, предложил тот Regex. IsMatch должен быть заменен строкой. Содержит. Таким образом, я задавался вопросом, стоило ли изменение внести.
В простых случаях String.Contains
даст вам лучшую производительность, но String.Contains
не позволит вам выполнять сложное сопоставление с образцом. Используйте String.Contains
для сценариев без сопоставления с образцом (например, в вашем примере) и используйте регулярные выражения для сценариев, в которых требуется более сложное сопоставление с образцом.
С регулярным выражением связаны определенные накладные расходы (синтаксический анализ выражения, компиляция, выполнение и т. Д.), Которых просто нет в простом методе, таком как String.Contains
, поэтому String.Contains
превзойдет регулярное выражение в таких примерах, как ваш.
Да, для этой задачи string.Contains почти наверняка будет быстрее и будет использовать меньше памяти. И, конечно же, здесь нет причин использовать регулярное выражение.
Чтобы определить, что быстрее, вам придется провести сравнительный анализ собственной системы. Однако регулярные выражения сложны, и есть шанс, что String.Contains()
будет самым быстрым, а в вашем случае и самым простым решением.
Реализация String.Contains()
в конечном итоге вызовет родной метод IndexOfString()
, реализация которого известна только Microsoft. Однако хорошим алгоритмом для реализации этого метода является использование алгоритма Knuth-Morris-Pratt. Сложность этого алгоритма составляет O(m + n), где m - длина искомой строки, а n - длина искомой строки, что делает этот алгоритм очень эффективным.
На самом деле, эффективность поиска с использованием регулярных выражений может быть низкой O(n) в зависимости от реализации, поэтому в некоторых ситуациях он может быть конкурентоспособным. Определить это можно только с помощью бенчмарка.
Если вас действительно волнует скорость поиска, то у Кристиана Шарраса и Тьерри Лекрока есть много материала о алгоритмах точного сопоставления строк в Université de Rouen.