Skip to content

Оптимизация regex: бенчмарк

Давай напишем бенчмарк к функции, с которой мы работали в прошлой главе, чтобы на практике понять принцип оптимизации regex.

Мы видим результаты нашего бенчмарка, но пока нам это ничего не говорит.

Попробуем оптимизировать функцию SanitizeText, написав более эффективное решение.

Воспользуемся функцией init() для первоначальной инициализации, использовать функцию init считается плохой практикой, потом мы это исправим.

Мы добавили компиляцию regex на этап инициализации приложения, изменили первый цикл замены текста (выделено синим цветом). Результат компиляции регулярок мы храним в глобальной переменной replacementMapRe на уровне пакета.

Сравним производительность двух функций.

Как можно увидеть, на первую функцию у нас уходит 2068994 наносекунд на операцию и 1321059 во второй версии нашей функции очистки текста, что примерно в 1.5 раза быстрее.

Приведем наш код в порядок. Создадим структуру TextFilter, избавимся от функции init в пользу инициализации в конструкторе, также откажемся от глобальных переменных.

  1. Создадим структуру.

  1. Перенесем инициализацию в конструктор.

 

  1. Вторую версию функции SanitizeText переведем в метод структуры.

  1. Модифицируем написанный бенчмарк.

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

Ознакомься с дополнительными материалами по теме: