Итак, у меня есть следующий Regex, который я использую для подсветки синтаксиса:Regex оптимизации производительности
static Regex cKeyWords = new Regex("(\t|\r\n|\\s|\\(|\\)|^)(auto|break|c(ase|har|onst|ontinue)|d(efaut|ouble)|e(lse|num|xtern)|f(loat|or)|goto|i(f|nt)" +
"|long|re(gister|turn)|s(hort|igned|izeof|tatic|truct|witch)|typedef|u(nion|nsigned)|v(oid|olatile)|while)(?=\t|\r\n|\\s|\\(|\\)|{|}|$)", RegexOptions.Compiled);
Он делает то, что я хочу, но когда дело доходит до больших файлов с около 200 000 символов, она занимает немного больше чем 6 секунд.
Если есть способ улучшить производительность?
EDIT: После того, как хороший взгляд на все комментарии/ответы/советы, теперь у меня есть это:
static Regex cKeyWords = new Regex(@"\b(?:
s(?:hort|i(?:gned|zeof)|t(?:atic|ruct)|witch) | c(?:ase|har|o(?:nst|ntinue)) |
e(?:lse|num|xtern) | i(?:f|nt) | f(?:loat|or) | d(?:efault|ouble) | un(?:ion|signed) |
re(?:gister|turn) | vo(?:id|latile) | while | break | long | typedef | auto | goto
)\b",
RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
Это один может обрабатывать 200000 символов текста примерно 5,5 секунды. Лучше. Тем не менее, я продолжу делать некоторые тесты, чтобы узнать, могу ли я еще больше сократить время.
Это регулярное выражение является оптимальным (помимо использования '()' вместо '(? :)', но это крошечная проблема). Вы должны посмотреть, почему вы пытаетесь выделить 200kb за один проход. Нет текстового редактора. Редакторы кода обычно поддерживают область в начале строки и выделяют поэтапно. См. [Документы AvalonEdit] (http://avalonedit.net/documentation/html/4d4ceb51-154d-43f0-b876-ad9640c5d2d8.htm). –
@LucasTrzesniewski 1) Я действительно пытался использовать (? :). Это фактически сделало выделение немного быстрее (сокращенное общее время на 0,2 с). 2) Я думаю, вы правы. Выделение такого огромного файла за один проход не очень хорошо. Я посмотрю ссылку, которую вы предоставили. –
И как еще одна оптимизация для регулярного выражения C#, используйте атомарную группировку по всему шаблону (заключите в '(?> ...)'), чтобы избежать ненужного возврата. –