Подтвердить что ты не робот

Что означает "<Цикл 1>", показанный в Xdebug?

У меня есть профиль xdebug на php script, который я проанализировал с помощью kcachegrind. Вот скриншот, показывающий, что наибольшее время, проведенное внутри любой заданной функции, проводилось внутри <cycle 1>, а верхние "Callers" были сделаны из "include" и "include_once" в index.php.

kcachegrind of xdebug profile showing cycle 1

Этот профиль запускался во время стресс-теста с использованием apache 'ab', поэтому было много одновременных подключений.

Что указывает <cycle 1> в профиле xdebug?

4b9b3361

Ответ 1

Это эвристическое определение цикла. Вы можете отключить его с панели инструментов или из меню "Вид → Обнаружение циклов" или "Просмотр → Обнаружение цикла".

Цикл - это что-то вроде рекурсии, как прямые (f() -> f() -> f() где -> означает вызов), так и косвенный (f()->g()->f()->g()->f())

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

Ответ 2

Хотя @osgx упоминает, что вы можете отключить обнаружение цикла, я просто хотел указать здесь, что если вы чувствуете, что <cycle 1> скрывает что-то интересное к вам, вы, вероятно, должны поворачиваться как он объясняет.

Отключение обнаружения цикла в моем случае фактически выявило некоторые ключевые фрагменты информации, которые раньше отсутствовали.