Компиляция и многократное использование в регулярных выражениях
Вы можете оптимизировать производительность приложений, которые используют широкое использование регулярных выражений, понимая, как подсистема регулярных выражений компилирует выражения и как кэшируются регулярные выражения. В этой статье рассматривается компиляция, создание источника и кэширование скомпилированных регулярных выражений.
Интерпретированные регулярные выражения
По умолчанию обработчик регулярных выражений компилирует регулярное выражение в последовательность внутренних инструкций (это коды высокого уровня, отличающиеся от общего промежуточного языка или CIL). Когда обработчик выполняет регулярное выражение, он преобразовывает внутренние коды.
Скомпилированные регулярные выражения
Regex Если объект построен с RegexOptions.Compiled помощью параметра, он компилирует регулярное выражение в явный код CIL вместо внутренних инструкций высокого уровня регулярного выражения. Это позволяет JIT-компилятору платформы .NET преобразовывать выражение в изначальный машинный код данного объекта для повышения производительности. Стоимость конструирования объекта Regex может быть выше, однако стоимость выполнения совпадений, скорее всего, будет значительно меньше.
Созданные источником регулярные выражения
Создание источника для регулярных выражений доступно в .NET 7 и более поздних версиях. Исходный генератор выдает код C#, пользовательскую Regex
производную реализацию с логикой, аналогичной тому, что RegexOptions.Compiled
выдает в IL. Вы получаете все преимущества производительности пропускной способности и преимущества RegexOptions.Compiled
Regex.CompileToAssembly
запуска, но без сложности CompileToAssembly
. Источник, который создается, является частью проекта, что означает, что он также легко просматривается и отлаживаться.
По возможности используйте созданные источником регулярные выражения вместо компиляции регулярных выражений RegexOptions.Compiled с помощью параметра. Дополнительные сведения об источниках регулярных выражений см . в генераторах источников регулярных выражений .NET.
Кэш регулярных выражений
Для повышения производительности обработчик регулярных выражений поддерживает кэш скомпилированных регулярных выражений на уровне приложения. Кэш хранит шаблоны регулярных выражений, которые используются только при вызове статических методов. (Шаблоны регулярных выражений, предоставляемые методам экземпляра, не кэшируются.) Кэширование позволяет избежать необходимости повторного анализа выражения в высокоуровневый код байтов при каждом использовании.
Максимальное число кэшированных регулярных выражений определяется значением static
(Shared
в Visual Basic) свойства Regex.CacheSize. По умолчанию обработчик регулярных выражений кэширует до 15 скомпилированных регулярных выражений. Если число скомпилированных регулярных выражений превышает размер кэша, из него удаляется наиболее давнее по использованию регулярное выражение и кэшируется новое регулярное выражение.
Приложение может повторно использовать регулярные выражения одним из указанных далее двух способов.
- Вы можете использовать статический метод объекта Regex для определения регулярного выражения. Если используется шаблон регулярного выражения, который уже был определен при вызове другого статического метода, обработчик регулярных выражений попробует извлечь его из кэша. Если он недоступен в кэше, обработчик скомпилирует регулярное выражение и добавит его в кэш.
- Вы можете многократно использовать существующий объект Regex везде, где потребуется созданный его шаблон регулярного выражения.
Из-за затрат на создание экземпляра объекта и компиляцию регулярных выражений создание и быстрое уничтожение многочисленных Regex объектов является дорогостоящим процессом. Для приложений, использующих большое количество разных регулярных выражений, производительность можно повысить путем вызова статических методов Regex
и, возможно, путем увеличения размера кэша для регулярных выражений.