Я использую 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 игнорировать или дорожку отдельно дополнительное время, потраченное на вызовы профилировщика?