Новое в Symfony 6.3 — Улучшения производительности

Источник: «New in Symfony 6.3: Performance Improvements»
Symfony 6.3 улучшает производительность извлечения сообщений перевода, компиляции сервисного контейнера и нормализации/денормализации сериализатора.

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

Улучшение производительности извлечения сообщений перевода

Команда translation:extract сканирует все файлы вашего приложения для поиска переводимого содержимого, чтобы помочь обновить файлы перевода. Это очень удобная команда, но она может медленно работать в больших кодовых базах (например, 100000 и более PHP файлов), потому что она анализирует содержимое вашего PHP файла с помощью AST.

В Symfony 6.3 мы улучшили процесс извлечения, чтобы создавать AST только для PHP-файлов, содержащих содержимое, связанное с переводом. Используя быстрое регулярное выражение, мы определяем, содержи ли файл элемент ->trans(, и если нет, мы не пытаемся анализировать их содержимое.

На практике время выполнения этой команды сократилось более чем на 70% в проекте из 100000 PHP файлов.

Разрешение отключения XML-дампа контейнера

В режиме отладки приложения Symfony компилирует информацию о сервисном контейнере в XML файл. Этот файл используется разными командами, такими как:

Однако для очень больших приложений (десятки тысяч файлов) генерация этого файла может занять несколько секунд (и размер генерируемого файла составляет 20 МБ). Для некоторых проектов/разработчиков в этих случаях преимущества этого файла не превышают общее снижение производительности.

Вот почему в Symfony 6.3 мы представили новую опцию конфигурации под названием debug.container.dump. Установите для неё значение false, чтобы больше не выгружать информацию о контейнере в XML-файл.

Улучшение производительности нормализаторов/денормализаторов сериализатора

Компонент Serializer использует массивы PHP в качестве промежуточного представления между объектами и их сериализованным содержимым. Нормализаторы/денормализаторы заботятся о превращении объектов в массивы и наоборот.

В Symfony 6.3 мы добавили метод getSupportedTypes(?string $format): array для нормализации/денормализации, чтобы они могли обновлять тип объектов, которые они могут обрабатывать и которые они могут кэшировать.

Таким образом, Symfony сначала пытается вызвать этот метод, вместо того, чтобы всегда вызывать методы supportsNormalization() и supportsDenormalization(). Мы уже обновили все встроенные нормализаторы/денормализаторы, чтобы добавить этот метод:

class DateTimeNormalizer implements NormalizerInterface, DenormalizerInterface, CacheableSupportsMethodInterface
{
// ...

public function getSupportedTypes(?string $format): array
{
$isCacheable = __CLASS__ === static::class || $this->hasCacheableSupportsMethod();

return [
\DateTimeInterface::class => $isCacheable,
\DateTimeImmutable::class => $isCacheable,
\DateTime::class => $isCacheable,
];
}
}

В зависимости от приложения это может значительно повысить производительность. В наших собственных тестах некоторые приложения сократили время затрачиваемое на вызовы getNormalizer() более чем на 80%.

Другие незначительные изменения

В дополнение к этим большим изменениям производительности мы внесли другие незначительные изменения, такие как:

Большинство этих улучшений стало возможно благодаря Blackfire, который позволяет нам профилировать PHP приложения для поиска проблемных мест, а затем измерять прирост производительности.

Дополнительные материалы

Предыдущая Статья

Vanilla JavaScript: Как работать с датами и временем

Следующая Статья

Внедрение PHP-CS-Fixer в легаси PHP-проекты