Может ли XDebug отдельно отслеживать время, потраченное на вызовы профилировщика? - PullRequest
11 голосов
/ 29 сентября 2011

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

Вот упрощенный пример, демонстрирующий проблему:

function foo(){ $x = 1; }
function bar(){ foo(); }

Тест A:

$t0 = microtime(true);
for ($i = 0; $i < 1000000; $i++) foo();
echo microtime(true) - $t0;

Тест B:

$t0 = microtime(true);
for ($i = 0; $i < 1000000; $i++) bar();
echo microtime(true) - $t0;

Итак, вот результаты, которые я получаю (в секундах):

          profiler  | profiler  > profiler
          disabled  | enabled   > results
          --------------------------------------------------------------------
          output    | output    > total time   time in foo()   time in bar()
Test A    0.159     | 12.199    > 12.245       0.110           - (not called)
Test B    0.233     | 25.399    > 25.578       0.104           11.068

Ожидается увеличение времени выполнения из-задополнительные звонки на профилировщик.Также ожидается небольшое отклонение между выходом на основе микровремени и результатами профилировщика.Я повторял тесты несколько раз, и результаты всегда были похожи.

Из результатов, полученных в Тесте B с отключенным профилировщиком, можно сказать, что скрипт тратит около 0,159 секунд на foo () и 0,074 секунды.в баре ().Очевидно, что время, проведенное в bar (), меньше, чем время, проведенное в foo ().

Однако, когда я анализирую результаты профилировщика (с помощью qcachegrind), время , показанное как потрачено в bar () (= 11,068 секунд), смехотворно выше, чем время в foo () (= 0,104 секунды).Этому есть возможное объяснение: каждый раз, когда выполняется вызов функции, профилировщик запускает некоторый дополнительный код для отслеживания времени, потраченного на вызов.Я полагал, что это исключило это дополнительное время из результатов, но, по-видимому, это не так.

[EDIT] В результате профилировщик говорит, что bar () занимает больше времени, чем foo () в этой программе, что не так, как мы измерили с отключенным профилировщиком.Это даже не близко!Относительные результаты (процент времени, затраченного каждой функцией) полностью неверны.Этого не следует ожидать, потому что, если это так, профилировщик не может указать, какая функция занимает большую часть времени.Хотя ожидается, что абсолютные времена будут иметь (большие) различия, относительные времена не должны иметь. [/ EDIT]

Это приводит к невозможности использования результатов.Любой более модульный код (с большим количеством вызовов функций, оболочек, объектов и т. Д.) Строго наказывается, хотя это не , а медленнее!

Так что вопрос: есть ли способсказать XDebug игнорировать или дорожку отдельно дополнительное время, потраченное на вызовы профилировщика?

Ответы [ 4 ]

1 голос
/ 21 апреля 2012

К сожалению, это невозможно. Я больше не использую XDebug в качестве профилировщика и предлагаю, чтобы никто не использовал его.

1 голос
/ 12 октября 2011

вы не должны ожидать, что результаты профилировщиков будут такими же, как и при обычной операции, это неразборчиво (или вы должны замедлять работу, если это нежелательно)

но все же время в профилировщикеНапример, вы можете видеть, что, несмотря на то, что scripexcution длится дольше, результаты (некоторые ват) имеют масштаб по шкале

, используя профилировщики полезно для выявления проблемных точек, но результаты не могут быть такими же, как реальная жизнь для многих.оптимизирован (хотя бы с xdbug)

1 голос
/ 24 февраля 2012

Определенно дайте xhprof попробовать. Кажется, менее подвержен ошибкам. Не стучать Xdebug.

1 голос
/ 09 октября 2011

Известно, что xdebug ведет себя так и на самом деле никаких новостей.Извините, очевидно, что это новость для вас, и я не хочу сказать, что всем нужно это знать.

В качестве объяснения: xdebug выполняет всю работу, от начала до конца, демпинг / метрики все как объявлено.Это поставляется с с ценой (как это могло быть?).

Если вам нужно выбрать метрики в изолированном контексте в вашем скрипте, вы не должны запускать xdebug.Или, как показывает ваш вопрос: вы пытаетесь профилировать xdebug с включенным xdebug (с помощью PHP-кода!).Это не сработает, вы не можете профилировать скомпилированное PHP-расширение C с помощью пользовательского кода PHP, или, по крайней мере, я не буду так сильно доверять.Представьте, что библиотека изменяет поведение интерпретатора, того же интерпретатора, на котором работает ваш код профилирования.

Если вам действительно нужно профилировать определенную часть изолированного кода, xdebug просто не является предпочтительным инструментом.Ищите xhprof или, возможно, в реальной жизни Пинба .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...