Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : C - mesure de rapidité d'une routine
(Article écrit par Batchman et extrait d'Amiga News - juin 1991)
|
|
Ce mois-ci, je vous propose, et pour pas plus cher que d'habitude, de devenir en toute
simplicité le Maître du Temps. Puisque le métier de maître d'école est de moins en moins
prisé, le Maître de Bagdad ridiculisé, le maître du Monde menacé par le Maître de l'Univers,
le Maître des Clefs embarqué par SOS Fantômes, le mètre soixante-dix dépassé par le
mètre quatre-vingts, devenir Maître du Temps présente certains avantages.
La formule
La formule que je vais vous livrer vous permettra à votre guise de raccourcir ou de dilater
l'écoulement du temps (pour un espace-temps donné, mais ça, vous vous en doutiez, bien sûr).
Pour arriver à ce résultat fabuleux, un tout petit programme dont l'objet est de mesurer la rapidité
d'une routine. Je l'ai donc appelé : "Laboratoire Avancé de Recherches sur les Vitesses d'Exécution"
ou LARVE (j'adore les noms pompeux et les sigles ridicules, mais je me soigne).
Ce programme appelle répétitivement un sous-programme de votre choix pendant un
temps donné. Connaissant la durée du test et le nombre d'appels du sous-programme, on peut en
déduire son temps d'exécution. Pourquoi ne pas chronométrer tout simplement la durée d'un appel de
la routine ?
Là, j'avoue que, de votre part, cette question me surprend. Sans vouloir entrer dans des considérations
trop techniques, il faut savoir que le temps se mesure avec une horloge. Eh oui, même dans un ordinateur,
c'est plus pratique qu'une clepsydre ou un cadran solaire. Manque de chance, l'horloge de notre
Amiga est de conception yankee et non pas helvétique. C'est dommage car Longines nous aurait peut-être
fourni un outil plus commode que Commodore (sic).
Bref, n'épiloguons pas, l'heure récupérable par la fonction système "CurrentTime"
n'est précise qu'au millionième de seconde (ou microseconde pour ceux qui ont fait des études).
Bon, ça ne serait pas si mal si Commodore ne nous prévenait dans son ROM Kernel :
l'heure n'est mise à jour que, au mieux, soixante fois par seconde, c'est-à-dire, s'il
n'y a rien d'autre à faire, et généralement beaucoup moins souvent, dans le cas où l'ordinateur
est occupé à autre chose.
Voilà pourquoi, si l'on comparait l'heure avant l'appel de la routine à tester et l'heure après,
on aurait de grandes chances de trouver un résultat aberrant. Voire un écart nul si l'heure n'a
pas été mise à jour pendant l'appel de la routine, ce qui est possible si la routine est courte.
Et un temps d'exécution nul, cela n'a pas de sens (sauf si vous êtes équipés de la carte accélératrice
Transputer Supraconducteur à Arséniure de Gallium de chez Batchman Computer mais çà, c'est pour le
prochain Coin C).
Voyons maintenant le listing en détail
Une définition de macro (DUREE) permet de fixer la durée du test. Plus il est long et plus la
mesure est précise mais ce n'est pas la peine de le faire durer deux heures, surtout si la routine
est courte et si vous êtes pressé.
L'ouverture de la bibliothèque Intuition donne accès à la fabuleuse fonction CurrentTime, le
moteur de notre laboratoire spatio-temporel.
Avant de passer à l'action, les agents de Mission Impossible mettent toujours leurs montres à l'heure.
J'applique moi aussi ce secret de la réussite : pour être certain que le chronométrage sera correct,
il faut commencer dès que l'horloge est mise à jour. Si l'on ne prenait pas cette précaution,
l'heure de départ serait antérieure au départ réel et le calcul serait faussé. Ici, avec la séquence "A
vos marques, Prêt, Partez", on est certain de bien connaître l'heure du départ puisqu'on ne
commence qu'immédiatement après un changement d'heure.
Vient ensuite la séquence à chronométrer : c'est ici que vous insérez la routine que vous voulez tester.
A titre d'essai, j'ai placé un printf("A") qui, vous pourrez le vérifier, dure 10535 ms
soit à peu de chose près un centième de seconde.
Après la fin de la séquence à chronométrer, il faut vérifier que l'on n'a pas dépassé la durée du test.
Si c'est le cas, on s'arrête.
Enfin, on calcule la durée de chaque cycle. C'est le temps qui sépare le début de la fin, divisé par
le nombre de cycles et multiplié par un million pour obtenir un résultat en microsecondes.
On enlève 70 à ce résultat. Pourquoi donc, je vous prie, hmmm ? Tout simplement parce que 70 microsecondes,
c'est la durée d'un cycle "vide", la durée minimale des opérations à effectuer à chaque cycle pour vérifier
que le test doit s'arrêter ou continuer.
Et hop, par ici le listing
Bien, je vais vous laisser vous amuser à optimiser vos petites routines. Naturellement, je
précise que ce programme a été compilé sous Lattice et testé : il fonctionne. Enfin, n'oubliez pas
que l'Amiga est une machine multitâche (je ne dis pas çà pour vous) et que, par conséquent,
les temps que vous obtiendrez pourront éventuellement varier si d'autres processus tournent par
derrière (et je ne pense pas forcément à un virus...).
|