Повышение производительности / улучшение с помощью регулярных выражений - PullRequest
4 голосов
/ 20 января 2012

Если мне нужно проверить, существует ли, например, слово A или слово B в тексте (строка), есть ли разница в производительности, если я это сделаю:

if(text.contains(wordA) || text.contains(wordB))

чтобы использовать какое-то регулярное выражение, которое ищет строку?
Зависит ли это от формата регулярного выражения?
Или это просто вопрос вкуса?

UPDATE:
Если text.contains(wordA) равно false, то text.contains(wordB) будет оцениваться.
Это означает, что contains будет вызываться дважды.

Я думал, что с точки зрения производительности регулярное выражение может быть лучше, чем дважды вызывать contains.

Ответы [ 5 ]

4 голосов
/ 20 января 2012

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

 "performance".contains("form") // is true

это может быть не та пшеница, которую вы подразумевали под "словом". Вместо этого вы можете иметь шаблон

 "\\bform\\b"

Это будет соответствовать только полному слову в строке, которое может быть в начале или в конце.

4 голосов
/ 20 января 2012

Код, который у вас есть, четко выражает ваши намерения, более удобен для чтения, чем регулярное выражение, и, вероятно, быстрее.

В любом случае, существует очень низкая вероятность того, что эта часть вашего кода вызовет какие-либо существенные проблемы с производительностью. Так что я буду беспокоиться не о производительности, а о удобочитаемости и удобстве обслуживания.

3 голосов
/ 20 января 2012

Да, их разница. Contains выполняет различные манипуляции с массивами для поиска слов, регулярное выражение использует дифференцированную логику, поэтому она будет отличаться, производительность даже будет меняться в зависимости от того, как вы используете сопоставление с регулярным выражением.

Будет ли это значительным? это трудно сказать. Но самое лучшее, что вы должны осознать:

Сначала напишите свой код и не беспокойтесь о производительности, пока не столкнетесь с проблемами, после того как профилирование ясно покажет, что этот тест является проблемой.

Я бы просто использовал метод содержимого. Но это мнение, на самом деле ничего не проверяя.

2 голосов
/ 20 января 2012

На мой взгляд, дело вкуса.Избегайте преждевременной оптимизации, см. Практические правила для преждевременной оптимизации .

  1. Как правило, если вы ищете слова подстроки , а не шаблоны, тогда не используйте регулярные выражения.

  2. Для такого простого регулярного выражения с текстом будет существовать лишь небольшая разница в производительностипоиск, поэтому, если вы делаете этот поиск только время от времени, это не проблема производительности.Если вы делаете это несколько тысяч или более раз в цикле, то сделайте тест , если у вас проблемы с производительностью

2 голосов
/ 20 января 2012

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

wordA|wordB

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

Таким образом, по существу стоимость сводится к:

  • линейному поиску в строке дважды (2· длина строки )
  • или линейный поиск по строке один раз и построение DFA ( длина строки + длина регулярного выражения )

, если ваш текст очень большой и подстроки очень маленький, тогда это может стоить.

Тем не менее, выОптимизируем не то место, скорее всего.Используйте профилировщик, чтобы найти фактические узкие места в вашем коде и оптимизировать их;никогда не беспокойтесь о таких тривиальных «оптимизациях», если только вы не докажете, что они оказывают влияние.

И последнее, что нужно учесть: с помощью регулярного выражения вы можете убедиться, что вы действительно соответствуете словам (иливещи, которые выглядят как слова) вместо частей слова, что может быть реальной причиной для рассмотрения регулярных выражений вместо contains.

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