53 votes

Que signifie "<Cycle 1>" dans Xdebug ?

J'ai un profil xdebug sur un php script que j'ai analysé avec kcachegrind. Voici une capture d'écran montrant que le plus de temps passé à l'intérieur d'une fonction donnée l'a été à l'intérieur de <cycle 1> et le premier "Callers" a été créé à partir de "include" et "include_once" dans index.php.

kcachegrind of xdebug profile showing cycle 1

Ce profil a été exécuté au cours d'un test de résistance utilisant apache 'ab', de sorte que de nombreuses connexions simultanées ont eu lieu.

Qu'est-ce que <cycle 1> indiquer sur un profil xdebug ?

39voto

osgx Points 28675

Il s'agit d'une détection heuristique des cycles. Vous pouvez la désactiver à partir de la barre d'outils ou du menu "Vue->Détection des cycles" ou "Vue->Détection des cycles".

Le cycle est quelque chose comme la récursion, à la fois directe ( f() -> f() -> f() donde -> signifie appel) et indirect ( f()->g()->f()->g()->f() )

Le format Callgring (utilisé dans kcachegrind) ne sauvegarde pas la pile d'appels complète, il ne stocke que les paires appelant-calculé et il peut être difficile de restaurer des cycles plus longs à partir de ces informations.

27voto

Cory Klein Points 5117

Bien que @osgx mentionne que vous peut désactiver la détection du cycle, je voulais juste souligner ici que si vous pensez que <cycle 1> cache quelque chose d'intéressant pour vous, que vous avez probablement devrait Désactiver la détection de cycle comme il l'explique.

Dans mon cas, la désactivation de la détection des cycles a en fait révélé des éléments d'information essentiels qui n'existaient pas auparavant.

0 votes

Il me semble que le fait de le désactiver ne fait que masquer les informations relatives aux cycles. Elle ne révèle rien de nouveau. Cette solution revient à dire : "si vous n'aimez pas l'histoire de la page 9, ne lisez pas la page 9". La désactivation de la fonction n'a pas empêché les cycles de "cacher quelque chose d'intéressant pour [moi]".

0 votes

Octopus Cela fait quelques années, mais je me souviens que dans mon cas, la détection du cycle cachait en fait quelque chose d'intéressant pour moi. L'information que je recherchais était soit très difficile, soit impossible à trouver lorsque la détection de cycle était activée.

4 votes

@Octopus , ce qui se passe parfois, c'est que la "détection de cycle" fusionne (et obscurcit) un tas de détails qui pourraient être pertinents à voir ventilés ; dans ce cas, il est utile de désactiver la détection de cycle et de laisser ces détails apparaître. Dans mon cas, par exemple, il y avait plusieurs méthodes __get qui s'appelaient les unes les autres de manière répétitive et bien que l'utilisation soit parfaitement valide, elle consommait des tonnes de CPU. L'appel répétitif était masqué par la détection de cycle, qui, selon l'OMI, devrait être considérée comme une "détection/consolidation de cycle".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X