Новое в 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 файл. Этот файл используется разными командами, такими как:
config:dump-reference
debug:autowiring
debug:container
debug:router
lint:container
Однако для очень больших приложений (десятки тысяч файлов) генерация этого файла может занять несколько секунд (и размер генерируемого файла составляет 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%.
Другие незначительные изменения
В дополнение к этим большим изменениям производительности мы внесли другие незначительные изменения, такие как:
- Улучшения производительности класса
GlobResource
используемого для поиска файлов в компонентеConfig
, путём проверки шаблона для ограничения каталогов, используемых для поиска (изменение внесено Nicolas Grekas в PR #49676) - Ещё одно улучшение класса
GlobResource
: переупорядочивание некоторых условий значительно сократило количество инструкций I/O (20%) (изменение внесено Markus Staab в PR #50087) - Оптимизация кода
LuhnValidator
(изменение внесено Max Beckers в PR #49216) - Сокращение времени компиляции сервисного контейнера за счёт
InlineServiceDefinitionsPass
на 58% иContainerBuilder::inVendors()
на 7% (изменение внесено Nicolas Grekas в PR #48802)
Большинство этих улучшений стало возможно благодаря Blackfire, который позволяет нам профилировать PHP приложения для поиска проблемных мест, а затем измерять прирост производительности.