Profiling PHP / symfony : merci XHProf

Introduction

Il arrive souvent lors d’un développement informatique que l’on soit confronté à un problème de performances.

On essaie souvent d’optimiser des bouts de code que l’on croit être la cause des ralentissements mais sur des projets assez complexes il arrive qu’on ne regarde pas forcément au bon endroit.

Les étapes à suivre pour résoudre des problèmes de performances sont donc les suivantes :

  1. Mesurer : il est indispensable de connaître les performances actuelles de l’application/bout de code qui sous-performe.
  2. Optimiser (ou en tout cas essayer) : cela est lié à votre code, je vous laisse faire cette partie :)
  3. Comparer : est-ce que l’optimisation effectuée est vraiment efficace ? Tant qu’on n’est pas satisfait on revient à l’étape 2.

Je vais aborder dans cet article des solutions disponibles dans l’univers PHP pour permettre de travailler sur les étapes 1 et 3.

Mesurer les performances : le profiling.

Xdebug

Beaucoup de développeurs PHP connaissent xdebug qui propose des fonctionnalités de profiling.
Sous la forme d’extension PHP il permet d’avoir un fichier de profil de performances à partir du moment où l’on a activé le profiling.
On analyse ensuite ce fichier de résultat à l’aide d’outils comme KCacheGrind, WinCacheGrind, MacCallGrind… suivant notre plateforme.
Cela fonctionne bien pour du code PHP pas trop gros mais dès que le code se complexifie, les fichiers de profil peuvent devenir énorme (nous avons déjà ici vu des fichiers de plusieurs Go !).
L’activation du profiling a aussi pour effet de bord pas très pratique un gros ralentissement du code profilé.

En bref, on a longtemps utilisé xdebug par manque d’alternatives.

XHProf

Développé par Facebook et assez récent dans le monde PHP (il a été diffusé en mars 2009), XHProf est un profiler qui a énormément d’avantages sur xdebug.
Les fichiers de profil sont ridiculement petits quand on vient de xdebug (400ko vs 1.2Go pour un même code profilé sur notre projet).
L’activation de xhprof n’a quasiment aucun impact sur les performances du code analysé.
Facebook fournit des scripts PHP pour analyser directement en web les résultats du profiling.
Un dernier avantage, et non des moindres, est que l’on n’est pas obligé de profiler tout notre process PHP mais uniquement une portion de code. Cela n’est pas possible avec xdebug qui profile le process entier.

Comparer les résultats

Xdebug

Il est très difficile de comparer précisément deux profils de performances issus de xdebug. Si en plus les fichiers sont énormes cela rend la tâche impossible.

XHProf

La comparaison de profils est native dans XHProf ce qui permet très rapidement de voir si nos optimisations sont concluantes.

Intégration avec symfony

Après avoir commencé à utiliser XHProf, il nous a semblé judicieux de voir comment l’intégrer facilement dans un projet symfony. C’est ainsi que j’ai développé le plugin elXHProfPlugin qui nous permet d’avoir directement au niveau de la web debug toolbar de symfony la liste des profils de performances ainsi que la possibilité de comparer deux fichiers de profil (et ainsi profiter de la fonction native de comparaison de XHProf).
Voici 2 captures d’écrans qui illustrent l’intégration dans la web debug toolbar et la comparaison de profils.

Intégration de XHProf à la web debug toolbar de symfony

Intégration de XHProf à la web debug toolbar de symfony

Comparaison de runs avec XHProf

Comparaison de runs avec XHProf

Conclusion

Après avoir utilisé Xdebug pendant des années, nous utilisons XHProf avec beaucoup de facilité. Sa légéreté et son intégration à la debug toolbar de symfony nous permet de faire facilement des optimisations là où nous serions allé à reculons en utilisant Xdebug.

Et surtout n’oubliez pas cette phrase de Donald Knuth lors de vos développements :
« We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil« .

 

Serv-Tech

 

2 thoughts on “Profiling PHP / symfony : merci XHProf

  1. Joris > pas testé (je connaissais pas). Pour le debug, notamment en pas à pas en intégration avec PHPStorm on utilise xdebug.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *