Autres articles / Other articles

Mesurer le temps d'exécution d'un mot FORTH

publication: 11 juillet 2022 / mis à jour 11 juillet 2022

Read this page in english

 

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