Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » BASIC » Temps d'exécution

arn0691
ProgBoarder
Citer Windows XP Safari - Posté le 07/01/2011 à 13:43
Bonjour à tous.
Je cherche le moyen de mesurer le temps d'exécution en quick basic.
Par exemple sur une boucle du genre for i = 1 to 20000: next i
Les essais, avec le timer, montrent un manque de précision.
Selon le moment de lancement d'un petit bout de programme dans l'environnement de quick basiq, on obtient 0.
EX:

CLS
k% = 1
DO
start# = TIMER
LOCATE k%, 1
PRINT "start = "; start#
FOR i! = 1 TO 20000
NEXT i!
fin# = TIMER
LOCATE k%, 55
PRINT "fin# = "; fin#
tamps# = fin# - start#
PRINT "temps = "; tamps#;
LOCATE k%, 30
PRINT "nbr boucles = "; i!
k% = k% + 2
IF k% = 41 THEN END
LOOP UNTIL INKEY$ <> ""

Explication :
Proc = P4 3,2C fonctionnant à 3,36 Ghz
OS = XP pro sp3
Quick basic V4.5 (Attention écran sur 50 lignes).;)
Le timer compte des pulses issues d'une division d'un registre 16 bits sur 3600 secondes -->> 65536 / 3600 =~18.2
résolution 1/18.2 = 0.054945.
Le code à exécuter (la boucle for i..) est "stockée" dans le cache du proc de sorte que cette boucle est faite plus vite que le temps entre 2 pulses du timer. et on obtient donc 0.
Quelqu'un a-t-il une idée pour faire une mesure fiable.
Je sais que le kernel de windows gère les centièmes de seconde, mais je ne connais pas la technique qui me permettrai de chercher cette information.
Merci de vos réponses, et j'espère que j'ai été clair !;)

Edité par arn0691 ( 07/01/2011 13:57:41 )
RemonterCiter MacOS Safari - Posté le 07/01/2011 à 14:11
Je n'ai pas pratiqué le QBasic depuis bien trop longtemps, mais à l'époque je faisait ceci pour une pause précise :

http://www.progboards.com/sujet-1595_un_systeme_de_pause_precise.php

Comme je précisait pouvoir le définir à la miliseconde près, cela devrait t'intéresser, j'utilise sans doute un autre type de variable que toi.
Change la caféine en lignes de code, et aurait parfois besoin de l'inverse.
arn0691
ProgBoarder
RemonterCiter Windows XP Safari - Posté le 07/01/2011 à 16:04
Merci de ta réponse Neliger, mais cela ne correspond pas à mon problème, et aussi, je vais rectifier une idée reçue!
J'expose dans mon explication que le timer ne peut pas être sollicité pour une résolution inférieure à 0.055 seconde soit 55 milliseconde.
Cette technique permet de s'affranchir du type de machine et du processeur si le but rechercher est d'ordre supérieur à 0.1 seconde.
Mais il n'y a pas de réponse pour des éléments dont la redondance est inférieure au cadencement du timer.
Avec l'exemple que j'ai donné, et quelques variantes, j'ai pu mettre en évidence qu'entre 2 accès au timer (sur des boucles de 25000 points), le delta va de 0.046875 à 0.0625 en passant par 0.05859375 ect..
Les différences s'expliquent par un temps d'exécution par rapport aux accès au timer puisqu'ils ne sont pas synchronisés.
Pour conclure, rien ne donne une bonne valeur si c'est inférieur ou très inférieur à 0.055 second.
RemonterCiter MacOS Safari - Posté le 09/01/2011 à 16:26
Je ne pense pas que tu auras plus précis en QBasic.

Garde également en tête que les processeurs x86 ne sont pas synchrones, et que les différentes couches logicielles augmentent encore l'approximation d'exécution, la précision sera donc toujours variable, quelque soit la méthode utilisée.
Change la caféine en lignes de code, et aurait parfois besoin de l'inverse.

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2012 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,027 s - Crédits - Stats
1 connecté