Сравнение Xdebug 2 и Xdebug 3
Xdebug — это расширение PHP, которое помогает в отладке, трассировке, профилировании и предоставляет инструменты для покрытия кода, а также совершенствует PHP с помощью более информативных функций отладки.
Xdebug — это де-факто PHP-расширение для пошаговой отладки PHP и продуманный инструмент для разработки на PHP.
Разработанная Derick Rethans (Дерик Ритенс), Xdebug 2 — это текущая стабильная версия. Пре-релиз Xdebug 3 вышел всего несколько дней назад, и в этой статье приводятся улучшения производительности в новой версии.
Текущая стабильная версия Xdebug, Xdebug 2.8, имеет несколько вариантов конфигурации для выборочного подключения фич (таких как трассировка, покрытие кода, пошаговый отладчик и т. д.). Однако загрузка Xdebug в PHP оказывает значительное влияние на производительность, до такой степени, что разница в производительности в 2-10 раз уже стала нормой. Проект Composer, например, использует инструмент composer/xdebug-handler, повторно вызывающий команду Composer с отключенным Xdebug, если он обнаруживает, что Xdebug включен.
В течение нескольких сессий на различных PHP-конференциях Дерик рассказал о своих планах касательно Xdebug 3, который фокусируется на более модульной архитектуре, призванной уменьшить влияние xdebug на производительность, устраняя некоторые внутренние процессы обработки, которые Xdebug может не использовать ввиду того, что данная фича отключена.
Xdebug 3 mode
Xdebug 3 предоставляет новую конфигурацию xdebug.mode
, которая принимает режимы или просто работает в режиме off
(выключен), который снижает влияние на производительность практически до нуля.
Различные фичи в проекте Xdebug теперь объединены в селекторе режимов, что значительно снижает сложность его настройки.
[xdebug]
- xdebug.coverage_enable=1
- xdebug.auto_trace=0
- xdebug.gc_stats_enable=false
- xdebug.profiler_enable=0
- xdebug.profiler_enable_trigger=0
- xdebug.remote_autostart=0
- xdebug.overload_var_dump=0
- xdebug.default_enable=1
- xdebug.remote_enable=0
+ xdebug.mode = coverage
Режимы Xdebug — это простые параметры конфигурации, которые являются ключевыми в его преимуществах в производительности.
xdebug.mode=off
: все фичи Xdebug выключены, почти до нуля снижая влияние на производительность.xdebug.mode=develop
: предоставляет фичи для разработчика, такие как улучшенныйvar_dump
.xdebug.mode=debug
: шаговый отладчик.xdebug.mode=trace
: трассировщик кода.xdebug.mode=profile
: профилировщик кода.xdebug.mode=gcstats
: предоставляет статистику по сборке мусора PHP.
Бенчмарки
Следующие тесты производительности были сделаны на PHP 7.4, PHP 8.0 RC4, с Xdebug 2.8 и Xdebug 3.0 RC1 в качестве субъектов теста. Скрипт бенчмарка — стандартный micro_bench.php на PHP, который запускает несколько тестов на различных фичах PHP.
Обратите внимание, что Xdebug 2.8 недоступен и не скомпилирован под PHP 8.0. Все тесты PHP 8.0 проводятся исключительно в Xdebug 3. Все тесты выполняются с включенным Opcache, чтобы рассмотреть юзкейсы, близкие к реальным.
Влияние расширения на производительность
Загрузка самого расширения Xdebug может привести к значительному снижению производительности. Такие проекты, как Composer/xdebug-handler пытались обойти эту проблему, и Xdebug 3 теперь предоставляет режим off
, который обеспечивает близкое к нулю влияние на производительность при загрузке Xdebug.
В Xdebug 2 есть несколько параметров конфигурации, которые отключают различные фичи Xdebug. Основное отличие Xdebug 3 заключается в том, что при использовании xdebug.mode=off
он практически не влияет на производительность при загрузке расширения. Xdebug 2, с другой стороны, обрабатывает код и внутренние компоненты PHP, даже если эти функции отключены и не используются.
Маркеры mode=off
на графиках показывают время, затраченное на загрузку расширения (т. е. с zend_extension=xdebug.so
) и с установленным xdebug.mode=off
. На практике это отключает все фичи Xdebug в Xdebug 3 и сводит размер используемой памяти к нулю.
Для теста Xdebug 2 все функции были отключены с помощью нескольких конфигураций INI:
xdebug.coverage_enable=0
xdebug.auto_trace=0
xdebug.gc_stats_enable=false
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=0
xdebug.remote_autostart=0
xdebug.overload_var_dump=0
xdebug.default_enable=0
xdebug.remote_enable=0
Использование памяти в Xdebug 3 почти на 99,4% меньше, чем в Xdebug 2, когда все функции отключены.
Фичи для разработчика
Эти фичи Xdebug включают в себя перегруженную функцию var_dump
, которая предоставляет дополнительную информацию о call-файле и его позиции, а также о стектрейсах, прикрепленных к предупреждениям и ошибкам.
В Xdebug 3 этот режим включается с помощью xdebug.mode=develop
. В Xdebug 2 он шел с опциями конфигурации, указанными ниже, в то время как все остальное отключено:
xdebug.default_enable=1
xdebug.overload_var_dump=2
Xdebug 3 работает почти на 25% быстрее с включеныым Xdebug.mode=develop по сравнению с Xdebug 2.
Пошаговый отладчик
Когда пошаговый отладчик включен, Xdebug останавливает скрипт, если он сталкивается с точкой останова, и подключается к клиенту отладки. Следующий тест выполнен с включенным пошаговым отладчиком в Xdebug 2, но не содержит точек останова в коде.
xdebug.remote_autostart=1
xdebug.remote_enable=1
Пошаговый отладчик Xdebug 3 почти на 34% быстрее по сравнению с Xdebug 2.
Покрытие кода
Xdebug предоставляет фичу покрытия кода (code coverage), которая помогает измерить, какая часть кодовой базы была выполнена («покрыта») во время теста.
В дополнение к преимуществам производительности, Xdebug предоставляет покрытие пути, которое помогает детализировать покрытие кода до отдельных ветвей в тернарных и составных выражениях if
.
В Xdebug 2, покрытие кода тестировалось с переключателями INI, а в Xdebug 3 — с xdebug.mode=coverage
.
xdebug.coverage_enable=1
Также, этот бенчмарк выполнялся на тестовом наборе league/commonmark
, который проверяет несколько файлов, а не проводит микро-бенчмарк с исполнением одного и того же кода снова и снова.
Покрытие кода Xdebug 3 на 10% -38% быстрее по сравнению с Xdebug 2.
Xdebug vs PCOV
PCOV — это легкое PHP-расширение, которое предоставляет функцию покрытия кода без каких-либо дополнительных фич подобных Xdebug. Он работает значительно быстрее по сравнению с Xdebug 2 и Xdebug 3, несмотря на отсутствие поддержки покрытия пути.
Итог
Сравнив все показатели, можно с уверенностью сказать, что Xdebug стал гораздо производительнее благодаря своей модульной функциональности.
Обратите внимание, что xdebug.mode
может быть задан только в INI-файле или с помощью переменной среды XDEBUG_MODE=develop
, но теперь она упрощает временное включение отдельных фич Xdebug. Когда установлен режим xdebug.mode=off
, влияние на производительность близко к нулю.
Спасибо Derick Rethans за его потрясающую работу над проектом Xdebug уже более 18 лет. Также, он проверил этот пост на техническую точность. Поддержите этот заслуженный проект на xdebug.org/support.
Источник: Xdebug 2 vs Xdebug 3 Performance Comparison