CLASSE CHRONOMÈTRE HAUTE PRÉCISION

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 7 sept. 2005 à 22:04
Sergissimo Messages postés 2 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 4 novembre 2014 - 19 févr. 2008 à 19:24
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33697-classe-chronometre-haute-precision

Sergissimo Messages postés 2 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 4 novembre 2014
19 févr. 2008 à 19:24
Dans Form_Load de ma form, j'ai "c.Start", _
dans Command1_Click de ma form, j'ai
"MsgBox c.Value". Si je presse Command1 5 secondes après le chargement de ma form, MsgBox devrait me donner environ 5000,0001. Hors il me donne 1887,2201 soit à peine 2 secondes !
Quelqu'un peut-il expliquer ? Merci.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
1 avril 2006 à 14:43
Bonjour,

JE ne veux pas rentrer dans une grande polémique, mais... LE but affiché en présentation du code c'est de mesurer le temps d'exécution d'un code, dans un SEUL BUT : Retenir le meilleur algorithme !

Bien, si vous avez déjà fait des tests de mesures, l'important c'est pas tant la trés grande précision des mesures qui importe ! En effet, seul le classement est utile ! donc - milli, micro, pico, fento, atto - secondes, cela n'a pas trés grande importance pratique !

... ET pour 3 raisons :

1) La "sensibilité" des instructions ont des temps d'exécution en millisecondes... (c'est pas le plus important)

2) Pour tester la vitesse d'un algorithme, il faut impérativement le faire de nombreuses fois, en l'éxecutant en boucle de nombreuses fois encore ! C'est la moyenne qui importe le plus ! pour en resortir un classement...

3) Ensuite, il est clair, que deux algorithmes à peine discernables seront (ou pouront être) considérer comme aussi bon (intéressant). Seuls les différences de temps bien marquées (pour moi environ 10% en relatif - c'est un choix -) permet de retenir le meilleur algorithme... et dans bien des cas, les algorithmes qu'on teste ont des différences bien plus marquées !

PAR conséquent, et par expérience, j'ai pu constater que la moyenne qu'on obtient avec un simple TIMER ou avec GetTickCount sont en tout point semblable... donc aussi le classement... Je n'ai jamais essayé avec QueryPerformanceCounter, mais on comprend de suite que cela ne change rien...

Car ce qui est IMPORTANT, c'est de classer les algorithmes en fonction de leur temps MOYEN d'exécution, et que les différences sont dans 99,9% des cas bien supérieures à la milliseconde !

Le problème est bien plus dans le protocole pour tester un algorithme, que dans la grande précision de la mesure du temps !

Foi de µs !

=

Amicalement,
Us.
Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 décembre 2008
5 oct. 2005 à 14:56
oups :
durée = value() - cDelta
et non pas "plus".
ben oui on enlève la durée du traitement propre à la fonction value() ^^
Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 décembre 2008
5 oct. 2005 à 14:54
Tu n'aura pas la préçision de la microseconde car il y a beaucoup trop de traitement.
Déjà le coup du t1! = Timer ou Sleep(1) ou GetTickCount()...
(soit-disant précis 1 msec près) ont une précision de + ou - 5 msec.
Alors là si tu passes par le type Currency, par une classe (objet) et que tu fais un If,
la précision doit avoir un sacré flottement :)

Alors comment corriger ? simple, ajoute un

Dim cDelta as Currency

fais un benchmark de ton chrono (fait le fonctionner "tout seul" genre:)

start():t0=value():t1=value():t2=value():t3=value()

et le cDelta sera la compensation de la marge :

cDelta = (t0 + (t1 - t0) + (t2 - t1) + (t3 - t2)) / 4

et ainsi, une "vrai" mesure sera :

start()
[code]
durée = value() + cDelta

nota : d'un autre coté, plus ton CPU est rapide, plus cDelta tendra vers 0, ce qui voudra dire que tu es proche de la microseconde "réel". En revanche, pas tout le monde a un Intelle pentiome 12 à 375 gigahertz :)
mythic_kruger Messages postés 241 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 10 novembre 2005
8 sept. 2005 à 13:26
6 chiffres après la virgule.
L'incident est clos, j'ai du mal lire le premier post.
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
8 sept. 2005 à 13:18
Sur quel critère te base tu pour affirmer que ton "chrono" possède une précision de l'orde de la µseconde?
T'as fais des mesures à l'oscillo, comment peut tu savoir cela?
Ne le prends pas mal, c'est bien une question et rien d'autre je cherche pas la guerre moi .... j'aime comprendre les choses !

Merci d'avance
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
8 sept. 2005 à 11:27
ok. très bon à savoir. thx
PCPT
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 sept. 2005 à 08:48
Le retour 0 indiquerait que le processeur ne dispose pas de timer haute résolution (c'est le hard qui fournit, aucun calcul particulier). Depuis plus de 10 ans plus aucun processeur ne sort sans cela, on peut donc utiliser sans aucun problème.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
8 sept. 2005 à 01:01
BruNews-> en fait, c'est justement parce qu'il y a ce risque de renvoie que j'ai considéré (sans doute à tord) que cette "erreur" était due à la veriosn de windows. c'est pour çà que dans un de mes codes, j'utilise GetTickCount si échec de QueryPerf.
c'était juste çà l'idée, mal exprimée.
Mythic_Kruger-> au risque de citer un film : j'ai passé l'âge de ces conneries. j'ai juste cru que tu postais cette source en l'espoir ou l'attente de commentaires (encore à tord). fait la guerre sans moi.

bonne continuation
PCPT
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 sept. 2005 à 00:07
Clem > pour être exact, QueryPerformanceCounter ne renvoie rien d'autre que 0 en cas d'erreur, le pointeur c'est elle qui le reçoit et non l'inverse.
Ces APIs de haute résolution sont présentes depuis NT 3.1, on peut donc considérer dispo sur tous les Windows.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2005 à 23:23
Ben faudra aller guerroyer plus loin, j'ai beau avoir un faible pour l'époque des chavaliers et des duels, CS n'est pas un champ de batailles, aïe aïe...
mythic_kruger Messages postés 241 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 10 novembre 2005
7 sept. 2005 à 23:09
Une chose est sûre, le code n'est pas du copier/coller d'un code américain, mais du Kruger.
PCPT, je vais pas prendre la peine de t'envoyer un MP cette fois, je vais te le dire ici franco:
on a eu un accrochage c'est vrai, mais je pense qu'on devrait en rester là, c'est valable pour toi comme pour moi aussi.
En revanche si tu veux la guerre tu l'auras, on commence à se connaître tu le sais.
mythic_kruger Messages postés 241 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 10 novembre 2005
7 sept. 2005 à 22:35
Juste un mot pour dire que Brunews a déposé une source qui impose le respect des afficionados du timer
http://www.vbfrance.com/article.aspx?ID=9523
cs_Clem Messages postés 282 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 12 février 2007
7 sept. 2005 à 22:23
oui...et non en même temps ;)
un chrono ça sers à mesurer l'intervalle de temps écoulée entre deux instants, donc dans ce cas ça marche (ça servirait à quoi sinon d'afficher le temps en temps réel alors que déjà des millisecondes pour un humain c'est impossible à voir clairement!), mais si tu as envie de la voir afficher chaque instant, alors fait un timer qui affichera le temps^^
le but ici est de clairement mesurer le temps que met un code à s'éxécuter, et même si je n'aime pas les classes pour rien, son code est bon

il y a surtout une raison si le temps est renvoyé en string, c'est que l'api renvoi un pointer vers un LARGE_INTEGER, que vb ne traite pas ? (je me trompe peut être la, mais je ne pense pas en connaitre de larger_integer en vb)
cf: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timerfunctions/queryperformancecounter.asp

je dois avouer que la j'ai du mal à comprendre ta dernière phrase, QueryPerformanceCounter n'est pas présent dans le noyau linux...mais pas GetTickCount non plus, surtout que c'est du vb6, donc ça ne risque pas de tourner sur beaucoup d'autres os que windows :/

mythic ne s'est pas foulé je l'avoue, mais son code est interessant/utile, ça permet de savoir optimiser son code vb :)
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 sept. 2005 à 22:20
tous les Windows, voulais-je dire....
PCPT
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2005 à 22:16
et VB c'est pour tous les OS ???
non c'est pour Windows donc se servir de l'API est normal, non ?
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 sept. 2005 à 22:04
euh.....
en quoi c'est un chrono?
tu peux juste récupérer un temps, mais tu ne peux pas le récupérer à chaque fois qu'il change. ce n'est donc pas un chrono, et encore moins à la microseconde.
en plus, renvoyer un temps en String, là, il faut vraiment m'expliquer l'intérêt...

sans parler que cette API à beau être plus précise que GetTickCount, il faut prendre en compte qu'elle ne fonctionne pas sur tous les OS.
(pas noté)

PCPT
Rejoignez-nous