Vous souhaitez nous soutenir ? Devenez sponsor de l'association sur notre page Github
Tutoriels

Effectuer rapidement des benchmarks dans Laravel

Mathieu De Gracia avatar
Publié le 3 octobre 2022
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});

A lire

Autres articles de la même catégorie