Effectuer rapidement des benchmarks dans Laravel
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});
Tu veux commenter ? Crée un compte ou connecte-toi.
A lire
Autres articles de la même catégorie
La méthode createOrFirst
Voyons ensemble à quelles problématiques répond la nouvelle méthode createOrFirst !
Traquer un utilisateur dans les logs
Laravel offre la possibilité d'ajouter un contexte unique à chaque ligne de log, voyons comment utiliser cette feature pour traquer les erreurs d'un utilisateur !
Authentifier vos bots avec laravel/passport
Les différentes méthodes d'authentification OAuth2 permettent de répondre à des besoins et des circonstances variés. Dans cet article, nous authentifierons un bot avec laravel/passport !