Demat' iNal,
On (merci Sylvestre !) m'a fait découvrir un utilitaire, hyperfine 1, qui a changé mon quotidien, et ne cesse de me surprendre.
hyperfine, c'est un outil "gros grain" pour faire de la mesure de performance. Ceux qui sont habitués au module standard Python timeit 2 y retrouveront des principes similaires, mais adaptés au shell.
Sous sa forme la plus simple, hyperfine s'utilise de la manière suivante (ici pour mesurer combien de temps clang met à parser le fichier d'en-tête standard stdio.h):
% hyperfine 'echo "#include <stdio.h>"| clang -xc -fsyntax-only -'
Benchmark 1: echo "#include <stdio.h>"| clang -xc -fsyntax-only -
Time (mean ± σ): 21.6 ms ± 1.0 ms [User: 11.5 ms, System: 10.0 ms]
Range (min … max): 20.3 ms … 25.6 ms 112 runs
Quel plaisir d'avoir accès à autant d'information si rapidement. Les statistiques permettent d'apprécier grossièrement la reproductibilité, et donc la fiabilité, de l'expérience.
Si l'expérience a de gros problèmes de reproductibilité, hyperfine nous en avertit (ici on for ce le passage par un cache, via sccache 3:
% hyperfine 'echo "#include <stdio.h>"| sccache clang -xc -fsyntax-only -'
Benchmark 1: echo "#include <stdio.h>"| sccache clang -xc -fsyntax-only -
Time (mean ± σ): 26.4 ms ± 4.4 ms [User: 12.7 ms, System: 15.4 ms]
Range (min … max): 25.1 ms … 56.9 ms 51 runs
Warning: The first benchmarking run for this command was significantly slower than the rest (56.9 ms). This could be caused by (filesystem) caches that were not filled until after the first run. You should consider using the '--warmup' option to fill those caches before the actual benchmark. Alternatively, use the '--prepare' option to clear the caches before each timing run.
Et il nous suggère même de chauffer le cache, ou d'avoir une étape de préparation (non mesurée donc) avant de commencer l'expérimentation.
Mais la fonctionnalité qui m'a le plus bluffé, c'est la possibilité d'automatiser en un one-liner un petit protocole expérimental qui m'est très courant : vérifier si le commit sur lequel je viens de finir de travailler améliore ou pas les performances. Cas pratique :
Bossant sur le bug 2003034 lié au système de test de Firefox, j'ai crée une branche bug/2003034, fait mon travail de dev standard, commit du résultat, puis commande suivante (merci Julien o/)
% hyperfine -L branch bug/2003034^,bug/2003034 -s 'git checkout {branch}' 'TASKGRAPH_SERIAL=1 ./mach taskgraph full'
[...]
koikekès ? Le drapeau -L permet de définir des paramètres d'expérience (ici le paramètre branch) et de lui assigner plusieurs valeurs, une par expérience donc (ici bug/2003034^ puis bug/2003034). Le drapeau -s fournit un setup code, un code à exécuter avant chaque expérience. Et dans ce code les paramètres définit par -L sont substitués, /à la/ f-string. Le dernier argument est utilisé pour lancer chacune des expériences.
Au final on obtient une sortie de ce type :
% hyperfine -L branch bug/2003034^,bug/2003034 -w1 -r5 -s 'git checkout {branch}' 'TASKGRAPH_SERIAL=1 ./mach taskgraph full'
Benchmark 1: TASKGRAPH_SERIAL=1 ./mach taskgraph full (branch = bug/2003034^)
Time (mean ± σ): 68.209 s ± 0.639 s [User: 66.996 s, System: 4.318 s]
Range (min … max): 67.370 s … 69.035 s 5 runs
Benchmark 2: TASKGRAPH_SERIAL=1 ./mach taskgraph full (branch = bug/2003034)
Time (mean ± σ): 67.463 s ± 0.375 s [User: 66.367 s, System: 4.272 s]
Range (min … max): 66.807 s … 67.733 s 5 runs
Summary
TASKGRAPH_SERIAL=1 ./mach taskgraph full (branch = bug/2003034) ran
1.01 ± 0.01 times faster than TASKGRAPH_SERIAL=1 ./mach taskgraph full (branch = bug/2003034^)
Chaque expérience a son petit paragraphe, et on a même un récapitulatif de l'expérience. Génial.
Ce n'est pas de la grande algorithmique, mais j'y vois un soucis du détail qu'il faut apprécier : un outil qui répond à un besoin, qui le fait bien, et qui nous assiste jusque dans les détails, youpi. Allez, je retourne lire la page man !
PS:
Je t'écris moins souvent, tu m'en excuseras peut-être en sachant que j'entretiens une correspondance suivie avec ton comparse qui a défaut d'être en or, est en diamant. Un seul 4 épisode des codes fantastiques (et où les trouver) est passé en public pour l'année 2025. À défaut il y en a pas mal des années précédentes 5.
# Hypefine c'est bien, mangez en
Posté par shbrol . Évalué à 1 (+0/-0).
Je plussoie l'utilisation de
hyperfine, il y a aussi des fonctions sympa comme l'utilisation directe de fonctions bash ou l'export des résultats pour faire des jolis diagrammes.Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.