Когда я должен использовать Regex поверх строковых операций и наоборот только относительно производительности?Что происходит быстрее: регулярные или строковые операции?
ответ
Это зависит
Хотя манипуляции строка, как правило, несколько быстрее, реальная производительность сильно зависит от ряда факторов, в том числе:
- Сколько раз вы разбираете регулярное выражение
- Как ловко вы пишете строку кода
- ли регулярное выражение прекомпилируется
Как регулярное выражение становится более сложным, это займет гораздо больше усилий, и сложность написания эквивалентного кода манипуляции строкой, который хорошо работает.
Я сделал несколько тестов с двумя функциями, называемыми 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();
}
}
Фактический ответ заключается в том, что он сильно зависит от того, что вы делаете, как и как часто – SLaks
Ваш тест регулярного выражения очень не прав; вы перекомпилируете регулярное выражение каждый раз. Если вы повторно используете один экземпляр, он станет намного быстрее. Если вы передадите 'RegexOptions.Compiled', он станет еще быстрее. – SLaks
OK Спасибо, SLaks, я опубликую здесь свои новые результаты. –
Строковые операции всегда будут быстрее, чем операции регулярного выражения. Если, конечно, вы не выполняете строковые операции неэффективно.
Регулярные выражения должны быть проанализированы, а код сгенерирован для выполнения операции с использованием строковых операций. В лучшем случае операция регулярного выражения может делать то, что оптимально для выполнения строковых манипуляций.
Регулярные выражения не используются, потому что они могут делать что-либо быстрее, чем простые операции с строкой, он используется, потому что он может выполнять очень сложные операции с небольшим кодом с достаточно небольшими накладными расходами.
Я сделал некоторые профилирование в C# некоторое время назад, сравнивая следующее:
1) LINQ к объектам.
2) Лямбда выражения.
3) Традиционный итерационный метод.
Все 3 метода были протестированы как с регулярными выражениями, так и без них. В моем тестовом случае было ясно, что регулярные выражения довольно медленны, чем не-Regex во всех трех случаях при поиске строк в большом количестве текста.
Вы можете прочитать подробную информацию о моем блоге: http://www.midniteblog.com/?p=72
- 1. Что происходит быстрее, XPath или Regexp?
- 2. Что происходит быстрее: include() или file_get_contents()?
- 3. Что происходит быстрее, горизонтально или вертикально?
- 4. Что происходит быстрее? Рисование или композиция?
- 5. Что происходит быстрее, подзапрос или отдельный (MySQL)?
- 6. Что происходит быстрее, кэш key_cache или OS?
- 7. Что происходит быстрее? File_exist или запрос MySQL?
- 8. Что происходит быстрее: ldc.i4/ldstr или ldloc?
- 9. Что происходит быстрее, GDI + или libpng?
- 10. Что происходит быстрее - курсор или массив?
- 11. Что происходит быстрее: '-isKindOfClass:' или '-isEqualToString:'?
- 12. Что происходит быстрее: клонирование или использование потоков?
- 13. Что происходит быстрее, протокол ssh или git?
- 14. Что происходит быстрее? Массив Struct или DataTable
- 15. Что происходит быстрее? System.currentTimeMillis() или Date(). GetTime()?
- 16. Что происходит быстрее - если ... или выберите ...?
- 17. Что происходит быстрее, .on() или .click()?
- 18. Что происходит быстрее, звонки или вызов массива?
- 19. Что происходит быстрее: JavaScript или JQuery
- 20. Что происходит быстрее?
- 21. Побитовые операции - что происходит?
- 22. Эффективность SQL - что происходит быстрее?
- 23. Что происходит быстрее и почему?
- 24. Что происходит быстрее, pipe | fifo
- 25. Строковые операции в Ansible
- 26. злоупотребляя JavaScript строковые операции
- 27. Строковые двоичные операции
- 28. Что быстрее для побитового NOT операции: предварительно вычислены таблицы или `~`
- 29. Что происходит быстрее: присоединяйтесь к GROUP BY или подзапрос?
- 30. Что происходит быстрее для создания разметки, jquery или php?
Простой вопрос с простым ответом. Если вы хотите оптимизировать производительность, выберите вариант, который работает лучше. –