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 ?
Une version Windows de QCacheGrind existe :-) sourceforge.net/projects/qcachegrindwin
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 ?
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 :
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 :
(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 !
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/.
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.
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.
0 votes
Il suffit d'utiliser la commande
time
dans Linux