130 votes

Comment puis-je mesurer la vitesse du code écrit en PHP?

Comment puis-je dire quelle classe parmi plusieurs (qui font toutes le même travail) s'exécute plus rapidement ? Existe-t-il un logiciel pour mesurer cela ?

0 votes

Il suffit d'utiliser la commande time dans Linux

221voto

Pascal MARTIN Points 195780

Vous avez (au moins) deux solutions :

La solution assez "naïve" consiste à utiliser microtime(true) avant et après une portion de code, pour obtenir le temps écoulé pendant son exécution ; d'autres réponses l'ont déjà mentionné et ont donné des exemples, donc je n'en dirai pas plus.

C'est une bonne solution si vous voulez faire des tests de performances sur quelques instructions ; par exemple comparer deux types de fonctions -- c'est mieux si cela est fait des milliers de fois, pour s'assurer que tout élément perturbateur soit pris en compte.

Quelque chose comme ceci, donc, si vous voulez savoir combien de temps cela prend pour sérialiser un tableau :

$before = microtime(true);

for ($i=0 ; $i<100000 ; $i++) {
    serialize($list);
}

$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";

Non parfait, mais utile, et cela ne prend pas beaucoup de temps à mettre en place.


L'autre solution, qui fonctionne bien si vous voulez identifier quelle fonction prend beaucoup de temps dans un script entier, est d'utiliser :

  • L'extension Xdebug, pour générer des données de profilage pour le script
  • Des logiciels qui lisent les données de profilage et vous présentent quelque chose de lisible. Je connais trois d'entre eux :
    • Webgrind ; interface web ; devrait fonctionner sur n'importe quel serveur Apache+PHP
    • WinCacheGrind ; uniquement sur Windows
    • KCacheGrind ; probablement uniquement sur Linux et linux-like ; C'est celui que je préfère, d'ailleurs

Pour obtenir des fichiers de profilage, vous devez installer et configurer Xdebug ; consultez la page Profiling PHP Scripts de la documentation.

Ce que je fais généralement, c'est de ne pas activer le profilage par défaut (cela génère des fichiers assez volumineux et ralentit les choses), mais d'utiliser la possibilité d'envoyer un paramètre appelé XDEBUG_PROFILE en tant que données GET, pour activer le profilage uniquement pour la page dont j'ai besoin.
La partie de mon php.ini liée au profilage ressemble à ceci :

xdebug.profiler_enable = 0              ; Profilage non activé par défaut
xdebug.profiler_enable_trigger = 1      ; Profilage activé lorsque demandé par le paramètre GET
xdebug.profiler_output_dir = /tmp/ouput_directory
xdebug.profiler_output_name = files_names

(Lisez la documentation pour plus d'informations)

Cette capture d'écran provient d'un programme C++ dans KcacheGrind : http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif
(source : <a href="http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif" rel="noreferrer">sourceforge.net</a>)

Vous obtiendrez exactement le même type de chose avec des scripts PHP ;-)
(Avec KCacheGrind, je veux dire ; WinCacheGrind n'est pas aussi bon que KCacheGrind...)

Cela vous permet d'avoir une bonne vue de ce qui prend du temps dans votre application -- et cela aide parfois définitivement à localiser la fonction qui ralentit tout ^^

Remarquez que Xdebug compte le temps CPU passé par PHP ; lorsque PHP attend une réponse de la base de données (par exemple), il ne travaille pas ; seulement en attente. Donc Xdebug pensera que la requête à la DB ne prend pas beaucoup de temps !
Cela devrait être profilé sur le serveur SQL, et non PHP, donc...

J'espère que ceci est utile :-)
Amusez-vous !

1 votes

Une version Windows de QCacheGrind existe :-) sourceforge.net/projects/qcachegrindwin

51voto

Scott Saunders Points 12721

Pour des choses rapides, je fais ceci (en PHP):

$startTime = microtime(true);
doTask(); // tout ce que vous voulez chronométrer
echo "Temps: " . number_format((microtime(true) - $startTime), 4) . " Secondes\n";

Vous pouvez également utiliser un profileur comme http://xdebug.org/.

2 votes

Pour une précision supplémentaire, je suggérerais (a) d'utiliser une boucle et de faire la moyenne du temps et (b) d'utiliser des fichiers séparés pour chaque chose que vous testez. Si vous avez plusieurs chronométrages dans un seul script, leur ordre peut parfois faire une différence.

6voto

troelskn Points 51966

5voto

Jason Points 1478

J'ai récemment utilisé XHProf http://pecl.php.net/package/xhprof. Il a été initialement développé par Facebook et il est livré avec une interface web décente.

3voto

OverloadUT Points 1144

Zend Studio a un support intégré pour le profilage en utilisant XDebug ou ZendDebugger. Il va profiler votre code, vous indiquant exactement combien de temps chaque fonction a pris. C'est un outil fantastique pour découvrir où sont vos goulots d'étranglement.

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