Effectuer rapidement des benchmarks dans Laravel

Publié le 3 octobre 2022 par Mathieu De Gracia
Couverture de l'article 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});
Mathieu De Gracia avatar
Mathieu De Gracia
Des fois, mon chat code à ma place 🐱

A lire

Autres articles de la même catégorie