Version de développement
Cette documentation décrit la version « next » (develop), non encore publiée. Pour la version stable, basculez sur « v5 » dans l'en-tête.
Développeurs

Exécuter des microbenchmarks

Mesurer les performances des opérations du framework (base de données, ORM, Redis, requêtes web) avec bench run-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_tests activé 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 :

ArgumentEffet
--filter <texte>Lance seulement les benchmarks dont le nom contient ce texte
-p5Mesure rapide et approximative, avec 5 processus
-o resultats.jsonEnregistre les résultats détaillés dans un fichier JSON
--helpAffiche 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.

FichierPréfixe des nomsDomaine
bench_database.pydatabase_frappe.db.get_value, set_value…
bench_orm.pyorm_Documents et métadonnées
bench_qb.pyqb_Query builder
bench_redis.pyredis_Cache Redis
bench_background_jobs.pybackground_jobs_Mise en file des tâches
bench_web_requests.pyweb_requests_Requêtes HTTP
bench_utils.pyutils_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

  1. Lancez les benchmarks sur le code de départ, avec -o avant.json.
  2. Appliquez votre modification.
  3. Lancez les mêmes benchmarks avec -o apres.json.
  4. 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

  1. Ouvrez le fichier bench_<domaine>.py qui correspond.
  2. 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.