2013-05-19 3 views
10

Когда я должен использовать Regex поверх строковых операций и наоборот только относительно производительности?Что происходит быстрее: регулярные или строковые операции?

+3

Простой вопрос с простым ответом. Если вы хотите оптимизировать производительность, выберите вариант, который работает лучше. –

ответ

15

Это зависит

Хотя манипуляции строка, как правило, несколько быстрее, реальная производительность сильно зависит от ряда факторов, в том числе:

  • Сколько раз вы разбираете регулярное выражение
  • Как ловко вы пишете строку кода
  • ли регулярное выражение прекомпилируется

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

4

Я сделал несколько тестов с двумя функциями, называемыми FunctionOne (строковые операции) и FunctionTwo (Regex). Они должны получить все совпадения между «<» и «>».

тест # 1:

  • раз называется: 1'000'000
  • вход: 80 символов
  • Длительность (строковые операции // FunctionOne): 1.12 сек
  • Длительность (регулярное выражение // FunctionTwo): 1,88 с

benchma гк # 2:

  • раз называется: 1'000'000
  • ввода: 2000 символов
  • Длительность (строка операции): 27.69 сек
  • Продолжительность (регулярные выражения операции): 41,436 сек

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

Код FunctionOne

private void FunctionOne(string input) 
     { 
       var matches = new List<string>(); 
     var match = new StringBuilder(); 
     Boolean startRecording = false; 
     foreach (char c in input) 
     { 
      if (c.Equals('<')) 
      { 
       startRecording = true; 
       continue; 
      } 

      if (c.Equals('>')) 
      { 
        matches.Add(match.ToString()); 
        match = new StringBuilder(); 
        startRecording = false; 
      } 

      if (startRecording) 
      { 
       match.Append(c); 
      } 
     } 
     } 

Код FunctionTwo

Regex regx = new Regex("<.*?>"); 
private void FunctionTwo(string input) 
    { 
     Match m = regx.Match(input); 
     var results = new List<string>(); 
     while (m.Success) 
     { 
      results.Add(m.Value); 
      m = m.NextMatch(); 
     } 
    } 
+7

Фактический ответ заключается в том, что он сильно зависит от того, что вы делаете, как и как часто – SLaks

+7

Ваш тест регулярного выражения очень не прав; вы перекомпилируете регулярное выражение каждый раз. Если вы повторно используете один экземпляр, он станет намного быстрее. Если вы передадите 'RegexOptions.Compiled', он станет еще быстрее. – SLaks

+0

OK Спасибо, SLaks, я опубликую здесь свои новые результаты. –

3

Строковые операции всегда будут быстрее, чем операции регулярного выражения. Если, конечно, вы не выполняете строковые операции неэффективно.

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

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

1

Я сделал некоторые профилирование в C# некоторое время назад, сравнивая следующее:

1) LINQ к объектам.

2) Лямбда выражения.

3) Традиционный итерационный метод.

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

Вы можете прочитать подробную информацию о моем блоге: http://www.midniteblog.com/?p=72

Смежные вопросы