Использует ли регулярное выражение быстрее, чем IndexOf?

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

Я использую IndexOf, чтобы определить, присутствует ли определенное ключевое слово.

Это идеальный способ или RegEX будет быстрее?

Обрабатывается около 10 элементов в секунду или около того.


person Jack Marchetti    schedule 21.02.2012    source источник
comment
Вы должны попробовать оба подхода и измерить, что быстрее. Кроме того, 10 раз в секунду — это еще ничего, о производительности здесь можно не беспокоиться.   -  person ken2k    schedule 21.02.2012
comment
Кроме того, нам нужно больше знать об относительной сложности синтаксического анализа. Если вам нужно вызвать String.IndexOf 10 раз для достижения того же эффекта, что и RegEx, коэффициент производительности будет другим, чем если бы он был равен 1 к 1.   -  person Chris Shain    schedule 21.02.2012
comment
10 элементов в секунду это ничто? Когда же вы на самом деле начнете заботиться о производительности?   -  person Jack Marchetti    schedule 21.02.2012


Ответы (9)


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

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

person Guffa    schedule 21.02.2012

http://ayende.com/blog/2930/regex-vs-string-indexof

Кажется, что это может иметь значение для эффективности длины строки.

person David Welker    schedule 21.02.2012

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

Единственный способ узнать наверняка — написать тест для вашего конкретного сценария.

person Peter    schedule 21.02.2012

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

Regex — гораздо более сложный механизм, который необходимо анализировать и проверять по всей строке. Если ваша строка очень большая, вам лучше использовать indexOf.

person F.P    schedule 21.02.2012

Прежде всего, при 10 элементах в секунду вам, вероятно, даже не нужно думать о производительности.

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

Его производительность также может зависеть от выбранного сравнения строк/культуры. Я ожидаю, что StringComparison.Ordinal будет самым быстрым.

person CodesInChaos    schedule 21.02.2012

Почему бы не поэкспериментировать и не измерить прошедшее время с помощью класса System.Diagnostics.Stopwatch? http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Настройте объект «Секундомер» перед операцией indexOf, а затем измерьте прошедшее время после нее. Затем замените indexOf на регулярное выражение. Наконец, сообщите о своих выводах, чтобы мы тоже могли их увидеть!

person Adil B    schedule 21.02.2012

По крайней мере, этот программист быстрее понимает код, использующий IndexOf!

Оправдывает ли небольшая экономия процессорного времени затраты времени, необходимого следующему человеку для понимания кода?

person Ian Ringrose    schedule 21.02.2012
comment
Регулярное выражение, которое находит первое вхождение строки, имитирующей indexOf, не доставит серьезных проблем ни одному программисту, если он захочет его понять. - person F.P; 21.02.2012
comment
@FlorianPeschka, согласен, что стоимость низкая, но просмотр регулярного выражения все еще требует затрат. - person Ian Ringrose; 21.02.2012
comment
RegEx.Match трудно понять? - person Jack Marchetti; 21.02.2012
comment
Если RegEx трудно понять, то разработчикам нужно немного поучиться. Это как если бы механик сказал, что шестигранными ключами пользоваться сложно, поэтому вместо них они используют что-то другое. Изучите инструменты своей профессии. Этому нет оправдания. - person Robert Koritnik; 23.07.2015

Кажется правильным, что регулярное выражение работает быстрее в более длинных строках. Мой пример: содержимое файла размером 364 КБ ищется по строке ‹product . Начальная точка перемещается, чтобы найти следующую, следующую и так далее. Однако искомая строка не найдена во всем значении.

Я использовал три тестовых команды:

         i = value.IndexOf("<" & tag & " ", xstart)

         i = value.IndexOf("<" & tag & " ", xstart, StringComparison.Ordinal)

         i = Regex.IsMatch(value.Substring(xstart), "<" & tag & " ", RegexOptions.Singleline)

Команде один (стандартный indexof) требуется ~ 7500 мс для поиска строки Команде два (indexof с порядковым номером) требуется ~ 300 мс! третья команда (регулярное выражение) требует ~ 650 мс (~ 1000 мс с опцией IgnoreCase).

person Herbert    schedule 03.06.2021

Вы можете найти информацию об этом самом запросе по этой ссылке: http://ayende.com/blog/2930/regex-vs-string-indexof

Таким образом, кажется, что чем больше шаблон поиска, тем лучше работает RegEx.

person Erik Nordenhök    schedule 21.02.2012