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
Maîtrisez les relations belongs-to-many avec la méthode attach
Attardons nous sur les subtilités de la méthode attach
Mathieu De Gracia
Cast un attribut de modèle en DTO
Utilisons un DTO en tant qu’attribut afin de rendre notre code plus consistant et éviter les surprises !
William Suppo
Le design pattern Repository dans Laravel
Explorons une implémentation du pattern Repository au sein d’une application Laravel.
William Suppo