Laravel dispose depuis sa version 9.32 d’un nouveau service Benchmark permettant de calculer rapidement les performances de quelques lignes de code.
1use Illuminate\Support\Benchmark;2 3$result = Benchmark::measure(function () {4 sleep(1);5});6 7dd($result); // 1000ms
Un argument iterations
est disponible pour réaliser la mesure plusieurs fois, le résultat obtenu sera une moyenne des différentes mesures.
1$result = Benchmark::measure(function () {2 sleep(rand(5, 10));3}, iterations: 3);4 5dd($result); // 5333ms
Une méthode dd
est également disponible pour obtenir directement le résultat dans un dump, sans passer par une variable intermédiaire.
1Benchmark::dd(function () {2 sleep(1);3}); // 1000ms
Comment ca fonctionne
Le service Benchmark se trouve dans le fichier Illuminate\Support\Benchmark.php
, voici les quelques lignes intéressantes de la méthode measure
.
1gc_collect_cycles();2 3$start = hrtime(true);4 5$callback();6 7return (hrtime(true) - $start) / 1000000;
Pour commencer, Laravel utilise un gc_collect_cycles pour forcer le nettoyage des cycles depuis son “Garbage Collector” et libérer de la mémoire, les performances du script que l’on cherche à mesurer seront donc “moins dépendantes” des exécutions précédentes.
Vous trouverez des détails sur le fonctionnement interne de PHP concernant sa gestion de la mémoire à ce chapitre de la documentation.
Ensuite, un hrtime est utilisé afin de conserver un “point arbitraire” dans le temps qui sera indépendant de l’horodatage du serveur, contrairement à l’utilisation d’un microtime.
Un changement d'heure sur le serveur n'affectera donc pas le
hrtime
.
Pour finir, le $callback()
exécute le code que l’on souhaite analyser avant de calculer le temps d’exécution à l’aide d’un second hrtime
, obtenant ainsi les performances en ms.
Attention, la mesure ainsi effectuée est relativement basique, le résultat sera très dépendant des aléas de votre machine et ne remplacera pas l’utilisation d’un véritable profiler tel que Blackfire.
Bonus
Saviez-vous qu’il était possible de calculer rapidement le temps d’exécution de Laravel en seulement quelques lignes ?
Lors de son initialisation, Laravel définit une constante LARAVEL_START
contenant un microtime
dans son fichier public/index.php
Un équivalant se trouve dans le kernel Artisan pour les commandes.
Désormais, profitez de la méthode terminating permettant d’exécuter une closure à la toute fin de l’exécution de Laravel pour calculer le temps d’exécution de votre projet !
1App::terminating(function () {2 3 $executionTime = microtime(true) - LARAVEL_START;4 5 dd($executionTime . 'ms');6});
A lire
Autres articles de la même catégorie
Des dépendances stables pour une architecture de qualité
Appliquons le Principe des Dépendances Stable (SDP) dans une application Laravel
Mathieu De Gracia
Inversion de dépendance en Laravel
Améliorons l'architecture de nos projets en implémentant une dépendance externe à travers 3 approches différentes.
Mathieu De Gracia
Piloter son application avec Forge
De l’installation du serveur au déploiement automatique, découvrons ensemble l’outil Forge.
William Suppo