[{"data":1,"prerenderedAt":532},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fmicrobenchmarks":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fmicrobenchmarks":531},{"id":4,"title":5,"body":6,"description":517,"extension":518,"meta":519,"navigation":484,"path":527,"seo":528,"stem":529,"__hash__":530},"docs\u002F2.next\u002F3.dodock\u002F10.developpeurs\u002Fmicrobenchmarks.md","Exécuter des microbenchmarks",{"type":7,"value":8,"toc":510},"minimark",[9,13,30,35,53,99,103,119,122,125,185,189,211,339,342,364,368,389,407,413,420,424,440,463,470,503,506],[10,11,5],"h1",{"id":12},"exécuter-des-microbenchmarks",[14,15,16,17,21,22,29],"p",{},"La commande ",[18,19,20],"code",{},"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 ",[23,24,28],"a",{"href":25,"rel":26},"https:\u002F\u002Fpyperf.readthedocs.io\u002F",[27],"nofollow","pyperf",".",[31,32,34],"h2",{"id":33},"prérequis","Prérequis",[36,37,38,42,48],"ul",{},[39,40,41],"li",{},"Un site de test neuf, sans données modifiées.",[39,43,44,47],{},[18,45,46],{},"allow_tests"," activé sur ce site. Sans cette option, la commande s'arrête.",[39,49,50,51,29],{},"Les dépendances de développement de Dodock, qui contiennent ",[18,52,28],{},[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bench new-site bench.localhost\nbench --site bench.localhost set-config allow_tests true\n","bash","",[18,61,62,78],{"__ignoreMap":59},[63,64,67,71,75],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"sBMFI","bench",[63,72,74],{"class":73},"sfazB"," new-site",[63,76,77],{"class":73}," bench.localhost\n",[63,79,81,83,86,89,92,95],{"class":65,"line":80},2,[63,82,70],{"class":69},[63,84,85],{"class":73}," --site",[63,87,88],{"class":73}," bench.localhost",[63,90,91],{"class":73}," set-config",[63,93,94],{"class":73}," allow_tests",[63,96,98],{"class":97},"sMK4o"," true\n",[31,100,102],{"id":101},"lancer-les-benchmarks","Lancer les benchmarks",[54,104,106],{"className":56,"code":105,"language":58,"meta":59,"style":59},"bench --site bench.localhost run-microbenchmarks\n",[18,107,108],{"__ignoreMap":59},[63,109,110,112,114,116],{"class":65,"line":66},[63,111,70],{"class":69},[63,113,85],{"class":73},[63,115,88],{"class":73},[63,117,118],{"class":73}," run-microbenchmarks\n",[14,120,121],{},"La commande vide le cache Redis du site, puis lance pyperf. La suite complète peut durer longtemps.",[14,123,124],{},"Tous les arguments après la commande vont à pyperf. Les plus utiles :",[126,127,128,141],"table",{},[129,130,131],"thead",{},[132,133,134,138],"tr",{},[135,136,137],"th",{},"Argument",[135,139,140],{},"Effet",[142,143,144,155,165,175],"tbody",{},[132,145,146,152],{},[147,148,149],"td",{},[18,150,151],{},"--filter \u003Ctexte>",[147,153,154],{},"Lance seulement les benchmarks dont le nom contient ce texte",[132,156,157,162],{},[147,158,159],{},[18,160,161],{},"-p5",[147,163,164],{},"Mesure rapide et approximative, avec 5 processus",[132,166,167,172],{},[147,168,169],{},[18,170,171],{},"-o resultats.json",[147,173,174],{},"Enregistre les résultats détaillés dans un fichier JSON",[132,176,177,182],{},[147,178,179],{},[18,180,181],{},"--help",[147,183,184],{},"Affiche les options de pyperf",[31,186,188],{"id":187},"benchmarks-disponibles","Benchmarks disponibles",[14,190,191,192,195,196,199,200,203,204,207,208,29],{},"Les benchmarks sont des fonctions ",[18,193,194],{},"bench_*"," dans les fichiers de ",[18,197,198],{},"frappe\u002Ftests\u002Fmicrobenchmarks\u002F",". Leur nom combine le fichier et la fonction : ",[18,201,202],{},"bench_get_value_simple"," de ",[18,205,206],{},"bench_database.py"," devient ",[18,209,210],{},"database_get_value_simple",[126,212,213,226],{},[129,214,215],{},[132,216,217,220,223],{},[135,218,219],{},"Fichier",[135,221,222],{},"Préfixe des noms",[135,224,225],{},"Domaine",[142,227,228,249,264,279,294,309,324],{},[132,229,230,234,239],{},[147,231,232],{},[18,233,206],{},[147,235,236],{},[18,237,238],{},"database_",[147,240,241,244,245,248],{},[18,242,243],{},"frappe.db.get_value",", ",[18,246,247],{},"set_value","…",[132,250,251,256,261],{},[147,252,253],{},[18,254,255],{},"bench_orm.py",[147,257,258],{},[18,259,260],{},"orm_",[147,262,263],{},"Documents et métadonnées",[132,265,266,271,276],{},[147,267,268],{},[18,269,270],{},"bench_qb.py",[147,272,273],{},[18,274,275],{},"qb_",[147,277,278],{},"Query builder",[132,280,281,286,291],{},[147,282,283],{},[18,284,285],{},"bench_redis.py",[147,287,288],{},[18,289,290],{},"redis_",[147,292,293],{},"Cache Redis",[132,295,296,301,306],{},[147,297,298],{},[18,299,300],{},"bench_background_jobs.py",[147,302,303],{},[18,304,305],{},"background_jobs_",[147,307,308],{},"Mise en file des tâches",[132,310,311,316,321],{},[147,312,313],{},[18,314,315],{},"bench_web_requests.py",[147,317,318],{},[18,319,320],{},"web_requests_",[147,322,323],{},"Requêtes HTTP",[132,325,326,331,336],{},[147,327,328],{},[18,329,330],{},"bench_utils.py",[147,332,333],{},[18,334,335],{},"utils_",[147,337,338],{},"Fonctions utilitaires",[14,340,341],{},"Exemple : lancer seulement les benchmarks de base de données.",[54,343,345],{"className":56,"code":344,"language":58,"meta":59,"style":59},"bench --site bench.localhost run-microbenchmarks --filter database_\n",[18,346,347],{"__ignoreMap":59},[63,348,349,351,353,355,358,361],{"class":65,"line":66},[63,350,70],{"class":69},[63,352,85],{"class":73},[63,354,88],{"class":73},[63,356,357],{"class":73}," run-microbenchmarks",[63,359,360],{"class":73}," --filter",[63,362,363],{"class":73}," database_\n",[31,365,367],{"id":366},"comparer-deux-versions-du-code","Comparer deux versions du code",[369,370,371,377,380,386],"ol",{},[39,372,373,374,29],{},"Lancez les benchmarks sur le code de départ, avec ",[18,375,376],{},"-o avant.json",[39,378,379],{},"Appliquez votre modification.",[39,381,382,383,29],{},"Lancez les mêmes benchmarks avec ",[18,384,385],{},"-o apres.json",[39,387,388],{},"Comparez les fichiers :",[54,390,392],{"className":56,"code":391,"language":58,"meta":59,"style":59},"pyperf compare_to avant.json apres.json\n",[18,393,394],{"__ignoreMap":59},[63,395,396,398,401,404],{"class":65,"line":66},[63,397,28],{"class":69},[63,399,400],{"class":73}," compare_to",[63,402,403],{"class":73}," avant.json",[63,405,406],{"class":73}," apres.json\n",[14,408,409,412],{},[18,410,411],{},"pyperf compare_to"," indique si l'écart est statistiquement significatif.",[14,414,415,416,419],{},"Pour des résultats stables, utilisez une machine Linux, arrêtez les autres processus et branchez l'ordinateur portable sur secteur. Le fichier ",[18,417,418],{},"README.md"," du dossier donne d'autres réglages (SMT, turbo, ASLR).",[31,421,423],{"id":422},"écrire-un-benchmark","Écrire un benchmark",[369,425,426,433],{},[39,427,428,429,432],{},"Ouvrez le fichier ",[18,430,431],{},"bench_\u003Cdomaine>.py"," qui correspond.",[39,434,435,436,439],{},"Ajoutez une fonction dont le nom commence par ",[18,437,438],{},"bench_",". Le corps de la fonction est la mesure.",[54,441,445],{"className":442,"code":443,"language":444,"meta":59,"style":59},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","def bench_get_value_simple():\n    for role in get_all_roles():\n        frappe.db.get_value(\"Role\", role, \"disabled\")\n","python",[18,446,447,452,457],{"__ignoreMap":59},[63,448,449],{"class":65,"line":66},[63,450,451],{},"def bench_get_value_simple():\n",[63,453,454],{"class":65,"line":80},[63,455,456],{},"    for role in get_all_roles():\n",[63,458,460],{"class":65,"line":459},3,[63,461,462],{},"        frappe.db.get_value(\"Role\", role, \"disabled\")\n",[14,464,465,466,469],{},"Pour une opération de moins d'une milliseconde, utilisez ",[18,467,468],{},"NanoBenchmark",". Il exécute une instruction sans le coût d'un appel de fonction :",[54,471,473],{"className":442,"code":472,"language":444,"meta":59,"style":59},"from frappe.tests.microbenchmarks.utils import NanoBenchmark\n\nbench_get_cached_doc = NanoBenchmark(\n    statement='frappe.get_cached_doc(\"Role\", \"Guest\")',\n)\n",[18,474,475,480,486,491,497],{"__ignoreMap":59},[63,476,477],{"class":65,"line":66},[63,478,479],{},"from frappe.tests.microbenchmarks.utils import NanoBenchmark\n",[63,481,482],{"class":65,"line":80},[63,483,485],{"emptyLinePlaceholder":484},true,"\n",[63,487,488],{"class":65,"line":459},[63,489,490],{},"bench_get_cached_doc = NanoBenchmark(\n",[63,492,494],{"class":65,"line":493},4,[63,495,496],{},"    statement='frappe.get_cached_doc(\"Role\", \"Guest\")',\n",[63,498,500],{"class":65,"line":499},5,[63,501,502],{},")\n",[14,504,505],{},"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.",[507,508,509],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":59,"searchDepth":66,"depth":80,"links":511},[512,513,514,515,516],{"id":33,"depth":80,"text":34},{"id":101,"depth":80,"text":102},{"id":187,"depth":80,"text":188},{"id":366,"depth":80,"text":367},{"id":422,"depth":80,"text":423},"Mesurer les performances des opérations du framework (base de données, ORM, Redis, requêtes web) avec bench run-microbenchmarks.","md",{"icon":520,"reviewed":484,"last_verified":521,"sources":522},"i-mdi-speedometer","2026-11-03",[523,524,525,526],"dodock@develop:frappe\u002Fcommands\u002Fmicrobenchmarks.py","dodock@develop:frappe\u002Ftests\u002Fmicrobenchmarks\u002Frun_benchmarks.py","dodock@develop:frappe\u002Ftests\u002Fmicrobenchmarks\u002Futils.py","dodock@develop:frappe\u002Ftests\u002Fmicrobenchmarks\u002FREADME.md","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fmicrobenchmarks",{"title":5,"description":517},"2.next\u002F3.dodock\u002F10.developpeurs\u002Fmicrobenchmarks","oHn5csCnLhBanENxpDPg5wZQpnRno88lLjkkQHjGCGs",{},1793871747458]