Exécuter des microbenchmarks
Exécuter des microbenchmarks
La commande bench run-microbenchmarks mesure le temps d'opérations courtes du framework : lecture d'une valeur en base, chargement d'un document, appel Redis, requête web… Elle sert à comparer les performances avant et après une modification du code. Elle utilise la bibliothèque pyperf.
Prérequis
- Un site de test neuf, sans données modifiées.
allow_testsactivé sur ce site. Sans cette option, la commande s'arrête.- Les dépendances de développement de Dodock, qui contiennent
pyperf.
bench new-site bench.localhost
bench --site bench.localhost set-config allow_tests true
Lancer les benchmarks
bench --site bench.localhost run-microbenchmarks
La commande vide le cache Redis du site, puis lance pyperf. La suite complète peut durer longtemps.
Tous les arguments après la commande vont à pyperf. Les plus utiles :
| Argument | Effet |
|---|---|
--filter <texte> | Lance seulement les benchmarks dont le nom contient ce texte |
-p5 | Mesure rapide et approximative, avec 5 processus |
-o resultats.json | Enregistre les résultats détaillés dans un fichier JSON |
--help | Affiche les options de pyperf |
Benchmarks disponibles
Les benchmarks sont des fonctions bench_* dans les fichiers de frappe/tests/microbenchmarks/. Leur nom combine le fichier et la fonction : bench_get_value_simple de bench_database.py devient database_get_value_simple.
| Fichier | Préfixe des noms | Domaine |
|---|---|---|
bench_database.py | database_ | frappe.db.get_value, set_value… |
bench_orm.py | orm_ | Documents et métadonnées |
bench_qb.py | qb_ | Query builder |
bench_redis.py | redis_ | Cache Redis |
bench_background_jobs.py | background_jobs_ | Mise en file des tâches |
bench_web_requests.py | web_requests_ | Requêtes HTTP |
bench_utils.py | utils_ | Fonctions utilitaires |
Exemple : lancer seulement les benchmarks de base de données.
bench --site bench.localhost run-microbenchmarks --filter database_
Comparer deux versions du code
- Lancez les benchmarks sur le code de départ, avec
-o avant.json. - Appliquez votre modification.
- Lancez les mêmes benchmarks avec
-o apres.json. - Comparez les fichiers :
pyperf compare_to avant.json apres.json
pyperf compare_to indique si l'écart est statistiquement significatif.
Pour des résultats stables, utilisez une machine Linux, arrêtez les autres processus et branchez l'ordinateur portable sur secteur. Le fichier README.md du dossier donne d'autres réglages (SMT, turbo, ASLR).
Écrire un benchmark
- Ouvrez le fichier
bench_<domaine>.pyqui correspond. - Ajoutez une fonction dont le nom commence par
bench_. Le corps de la fonction est la mesure.
def bench_get_value_simple():
for role in get_all_roles():
frappe.db.get_value("Role", role, "disabled")
Pour une opération de moins d'une milliseconde, utilisez NanoBenchmark. Il exécute une instruction sans le coût d'un appel de fonction :
from frappe.tests.microbenchmarks.utils import NanoBenchmark
bench_get_cached_doc = NanoBenchmark(
statement='frappe.get_cached_doc("Role", "Guest")',
)
Vérifiez que la mesure suit le bon chemin. Par exemple, pour mesurer une lecture dans Redis, évitez que le cache local réponde à sa place.