Mesurer le temps d'exécution d'un mot FORTH
publication: 11 juillet 2022 / mis à jour 11 juillet 2022
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
Mesurer la performance des définitions FORTH
Commençons par définir le mot measure:
qui va effectuer ces mesures de temps d'exécution:
: measure: ( exec: -- <word> )
ms-ticks >r
' execute
ms-ticks r> -
cr ." execution time: "
<# # # # [char] . hold #s #> type ." sec." cr
;
Dans ce mot, on récupère le temps par ms-ticks
, puis on récupère
le code d'exécution du mot qui suit measure:
, on exécute ce mot,
on récupère la nouvelle valeur de temps par ms-ticks
. On fait la différence,
laquelle correspond au temps écoulé, en millisecondes, pris par le mot pour s'exécuter.
Exemple:
measure: words \ display: execution time: 0.210sec.
Le mot words
a été exécuté en 0,2 secondes. Ce temps ne tient pas compte
des délais de transmission par le terminal. Ce temps ne tient pas compte non plus
du délai pris par measure:
pour récupérer le code d'exécution du mot
à mesurer.
S'il y a des paramètres à passer au mot à mesurer, ceux-ci doivent être empilés avant
d'appeler measure:
suivi du mot à mesurer:
: SQUARE ( n -- n-exp2 ) dup * ; 3 measure: SQUARE \ display: \ execution time: 0.000sec.
Ce résultat signifie que notre définition SQUARE
s'exécute en moins d'une milliseconde.
On va réitérer cete opération un certain nombre de fois:
: test-square ( -- ) 1000 for 3 SQUARE drop next ; 3 measure: test-square \ display: \ execution time: 0.001sec.
En exécutant 1000 fois le mot SQUARE
, précédé d'un empilage de valeur et dépilage du
résultat, on arrive à un délai d'exécution de 1 milliseconde. On peut raisonnablement déduire que
SQUARE
s'exécute en moins d'une micro-seconde!
Test de quelques boucles
On va tester quelques boucles, avec 1 million d'itérations. Commençons avec une boucle do-loop:
: test-loop ( -- ) 1000000 0 do loop ; measure: test-loop \ display: \ execution time: 1.327sec.
Voyons maintenant avec une boucle for-next:
: test-for ( -- ) 1000000 for next ; measure: test-for \ display: \ execution time: 0.096sec.
La boucle for-next s'exécute presque 14 fois plus rapidement que la boucle do-loop.
Voyons ce qu'une boucle begin-until a dans le ventre:
: test-begin ( -- ) 1000000 begin 1- dup 0= until ; measure: test-begin \ display: \ execution time: 0.273sec.
C'est plus performant que la boucle do-loop, mais quand même trois fois plus lent que la boucle for-next.
Vous voilà maintenant outillé pour réaliser des programmes FORTH encore plus performants.
Legal: site web personnel sans commerce / personal site without seling