Поделиться через


Компиляция и многократное использование в регулярных выражениях

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

Скомпилированные регулярные выражения

По умолчанию обработчик регулярных выражений компилирует регулярное выражение в последовательность внутренних инструкций (это коды высокого уровня, отличающиеся от общего промежуточного языка или CIL). Когда обработчик выполняет регулярное выражение, он преобразовывает внутренние коды.

Regex Если объект построен с RegexOptions.Compiled помощью параметра, он компилирует регулярное выражение в явный код CIL вместо внутренних инструкций высокого уровня регулярного выражения. Это позволяет JIT-компилятору платформы .NET преобразовывать выражение в изначальный машинный код данного объекта для повышения производительности. Стоимость конструирования объекта Regex может быть выше, однако стоимость выполнения совпадений, скорее всего, будет значительно меньше.

Также можно применить предварительно скомпилированные регулярные выражения. Все выражения можно скомпилировать в библиотеку DLL с помощью метода CompileToAssembly, чтобы использовать их многократно. Этим вы избавитесь от компиляции во время выполнения, сохраняя скорость работы как при использовании скомпилированных регулярных выражений.

Кэш регулярных выражений

Для повышения производительности обработчик регулярных выражений поддерживает кэш скомпилированных регулярных выражений на уровне приложения. Кэш хранит шаблоны регулярных выражений, которые используются только при вызове статических методов. (Шаблоны регулярных выражений, предоставленные методам экземпляра, не кэшируются.) Это позволяет избежать необходимости повторного анализа выражения в высокоуровневый код байтов при каждом использовании.

Максимальное число кэшированных регулярных выражений определяется значением static (Shared в Visual Basic) свойства Regex.CacheSize. По умолчанию обработчик регулярных выражений кэширует до 15 скомпилированных регулярных выражений. Если число скомпилированных регулярных выражений превышает размер кэша, из него удаляется наиболее давнее по использованию регулярное выражение и кэшируется новое регулярное выражение.

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

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

  • Вы можете многократно использовать существующий объект Regex везде, где потребуется созданный его шаблон регулярного выражения.

Создание и быстрое уничтожение многочисленных объектов Regex — это очень затратный процесс, так как высоки издержки на создание объектов и компиляцию регулярных выражений. Для приложений, использующих большое количество разных регулярных выражений, производительность можно повысить путем вызова статических методов Regex и, возможно, путем увеличения размера кэша для регулярных выражений.

См. также