PHP Profi

Сравнение производительности Xdebug 2 и Xdebug 3 Перевод

Xdebug 2 vs 3 benchmark

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 source, который запускает несколько тестов на различных фичах 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 2 vs 3 benchmark

Использование памяти в  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 2 vs 3 benchmark

Xdebug 3 работает почти на 25% быстрее с включеныым Xdebug.mode=develop по сравнению с Xdebug 2.

Пошаговый отладчик

Когда пошаговый отладчик включен, Xdebug останавливает скрипт, если он сталкивается с точкой останова, и подключается к клиенту отладки. Следующий тест выполнен с включенным пошаговым отладчиком в Xdebug 2, но не содержит точек останова в коде.

xdebug.remote_autostart=1 
xdebug.remote_enable=1

Xdebug 2 vs 3 benchmark - step debugger

Пошаговый отладчик Xdebug 3 почти на 34% быстрее по сравнению с Xdebug 2.

Покрытие кода

Xdebug предоставляет фичу покрытия кода (code coverage), которая помогает измерить, какая часть кодовой базы была выполнена ("покрыта") во время теста.

В дополнение к преимуществам производительности, Xdebug предоставляет покрытие пути, которое помогает детализировать покрытие кода до отдельных ветвей в тернарных и составных выражениях if.

В Xdebug 2, покрытие кода тестировалось с переключателями INI, а в Xdebug 3 - с xdebug.mode=coverage.

xdebug.coverage_enable=1

Xdebug 2 vs 3 benchmark - Code Coverage - single file
Также, этот бенчмарк выполнялся на тестовом наборе league/commonmark, который проверяет несколько файлов, а не проводит микро-бенчмарк с исполнением одного и того же кода снова и снова.

Xdebug 2 vs 3 benchmark - Code Coverage - multiple files

Покрытие кода Xdebug 3 на 10% -38% быстрее по сравнению с Xdebug 2.

Xdebug vs PCOV

PCOV - это легкое PHP-расширение, которое предоставляет функцию покрытия кода без каких-либо дополнительных фич подобных Xdebug. Он работает значительно быстрее по сравнению с Xdebug 2 и Xdebug 3, несмотря на отсутствие поддержки покрытия пути.

Xdebug 2 vs 3 benchmark - Code Coverage - multiple files


Итог

Сравнив все показатели, можно с уверенностью сказать, что Xdebug стал гораздо производительнее благодаря своей модульной функциональности.

Обратите внимание, что xdebug.mode может быть задан только в INI-файле или с помощью переменной среды XDEBUG_MODE=develop, но теперь она упрощает временное включение отдельных фич Xdebug. Когда установлен режим xdebug.mode=off, влияние на производительность близко к нулю.

Xdebug 2 vs 3 benchmark - Code Coverage - multiple files


Спасибо Derick Rethans за его потрясающую работу над проектом Xdebug уже более 18 лет. Также, он проверил этот пост на техническую точность. Поддержите этот заслуженный проект на xdebug.org/support.

2020-12-25 оригинал

Последние посты

Комментарии

авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий