Может ли XDebug отслеживать отдельно время, затраченное на вызовы профилировщика?
Я использую 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
ожидается увеличение времени выполнения из-за дополнительных вызовов профилировщик. Также ожидается небольшое отклонение между выводом на основе microtime и результатами профилировщика. Я повторил тесты несколько раз, и результаты всегда похожи.
из результатов, взятых из теста B с отключенным профилировщиком, можно сказать, что скрипт проводит около 0,159 секунды в foo () и 0,074 секунды в bar (). Очевидно, что время, проведенное в bar (), меньше времени, проведенного в foo().
однако, когда я анализирую результаты профилировщик (с qcachegrind), время показали как потрачено в bar () (=11.068 секунд) смехотворно выше, чем время в foo () (=0.104 секунд). Существует возможное объяснение этому: каждый раз, когда выполняется вызов функции, профилировщик запускает дополнительный код, чтобы отслеживать время, проведенное в вызове. Я считал, что это исключает дополнительное время из результатов, но, видимо, это не так.
[EDIT] В результате профилировщик говорит, что bar () принимает больше времени, чем foo() в этой программе, что не так, как мы измерили с отключенным профилировщиком. Это даже не близко! Относительные результаты (процент времени, затраченного каждой функцией) абсолютно неверны. Этого не следует ожидать, поскольку в этом случае профилировщик не может указать, какая функция занимает большую часть времени. Хотя абсолютные времена, как ожидается, будут иметь (большие) различия, относительные времена не должны иметь. [/EDIT]
этот делает результаты непригодными для использования. Любой код, который является более модульным (с большим количеством вызовов функций, оболочек, объектов и т. д.) строго наказывается, хотя и не это медленнее!
Итак, вопрос: есть ли способ сказать XDebug игнорировать или трек отдельно дополнительное время, потраченное на звонки профилировщика?
4 ответов
известно, что xdebug ведет себя так и на самом деле никаких новостей. Извините, очевидно, это новость для вас, и я не хочу говорить все должен знать это.
в качестве объяснения: xdebug делает все работа, от начала до конца, сбрасывая/метрицируя каждое как объявлено. Это идет С ценой (как это не могло?).
Если вам нужно выбрать метрики в изолированном контексте в вашем скрипте, вы не должны запускать отладчик xdebug. Или, как показывает ваш вопрос: вы пытаетесь профилировать xdebug с включенным xdebug (с PHP-кодом!). Это не сработает, вы не можете профилировать PHP-скомпилированное расширение C с пользовательским кодом PHP, или, по крайней мере, я не буду доверять этому. Представьте, что lib изменяет поведение интерпретатора, того же интерпретатора, на котором работает ваш код профилирования.
Если вам действительно нужно профилировать определенную часть вашего изолированного кода, xdebug просто не является инструментом выбора. Ищите xhprof или может быть, в реальной жизниPinba.
вы не должны ожидать, что результаты профилировщиков будут такими же, как и нормальная оппозиция, это inposseble(или вы должны замедлить оппозицию, которая не желательна)
но все же времена в De profiler очень полезны, например, вы можете видеть, что altrug scripexcution занимает больше времени, результаты (некоторые wat) cosistent со шкалой
использование профилировщиков полезно для точечных проблемных точек, но результаты не могут быть такими же, как reallife для mutch оптимизировано (по крайней мере, с xdbug)
к сожалению, это не возможно. Я больше не использую XDebug в качестве профилировщика, и я предлагаю, чтобы никто не использовал его.