Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSE CHRONOMÈTRE HAUTE PRÉCISION


Information sur la source

Description

Salut à tous!

Un module de classe à insérer dans un projet pour chronométrer ce que vous voulez, avec une précision de l'ordre de la microseconde.

Rappel:
1 milliseconde = 10 exposant -3 seconde (seconde sans "s" parce qu'on a moins d'une seconde)
1000 millisecondes = 1 seconde

1 microseconde = 10 exposant -6 seconde (symbole : µs)
1000 microsecondes = 1 milliseconde
1000000 microsecondes = 1 seconde

Son utilisation est simple: on lance le chronomètre et on affiche sa valeur.
Le module est suffisament commenté, place au code!
 

Source

  • Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
  • Private depart As Currency
  • Public Function Start()
  • Call QueryPerformanceCounter(depart)
  • End Function
  • Public Property Get Value() As String
  • Dim fin As Currency
  • If depart <> 0 Then
  • Call QueryPerformanceCounter(fin)
  • Value = CStr(fin - depart)
  • depart = 0
  • Else: Value = "0"
  • End If
  • End Property
  • 'Appel depuis un formulaire:
  • 'Dim Chronomètre As New Chrono
  • 'Chronomètre.Start
  • '... code à chronométrer
  • 'MsgBox Chronomètre.Value '~0.0052 ms "à vide" soit 5.2 microsecondes
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
Private depart As Currency

Public Function Start()
    Call QueryPerformanceCounter(depart)
End Function

Public Property Get Value() As String
    Dim fin As Currency
    If depart <> 0 Then
    Call QueryPerformanceCounter(fin)
    Value = CStr(fin - depart)
    depart = 0
    Else: Value = "0"
    End If
End Property

'Appel depuis un formulaire:
'Dim Chronomètre As New Chrono
'Chronomètre.Start
'... code à chronométrer
'MsgBox Chronomètre.Value '~0.0052 ms "à vide" soit 5.2 microsecondes

Conclusion

Intérêt majeur: chronométrer son propre code VB, pour déterminer quels sont les meilleurs algorythmes. Par exemple, mettre clairement en évidence que la fonction iif() est très, très lente comparée au if...then...else.
C'est un excellent moyen pour mesurer vos propres algorythmes! Et garder les meilleurs.

Bon code à vous les amis!
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de PCPT le 07/09/2005 22:04:49 administrateur CS

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

signaler à un administrateur
Commentaire de BruNews le 07/09/2005 22:16:40 administrateur CS

et VB c'est pour tous les OS ???
non c'est pour Windows donc se servir de l'API est normal, non ?

signaler à un administrateur
Commentaire de PCPT le 07/09/2005 22:20:50 administrateur CS

tous les Windows, voulais-je dire....
PCPT

signaler à un administrateur
Commentaire de Clem le 07/09/2005 22:23:15

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 :)

signaler à un administrateur
Commentaire de mythic_kruger le 07/09/2005 22:35:05

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

signaler à un administrateur
Commentaire de mythic_kruger le 07/09/2005 23:09:00

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.

signaler à un administrateur
Commentaire de BruNews le 07/09/2005 23:23:25 administrateur CS

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...

signaler à un administrateur
Commentaire de BruNews le 08/09/2005 00:07:37 administrateur CS

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.

signaler à un administrateur
Commentaire de PCPT le 08/09/2005 01:01:40 administrateur CS

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

signaler à un administrateur
Commentaire de BruNews le 08/09/2005 08:48:26 administrateur CS

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.

signaler à un administrateur
Commentaire de PCPT le 08/09/2005 11:27:06 administrateur CS

ok. très bon à savoir. thx
PCPT

signaler à un administrateur
Commentaire de philippe laschweng 1 le 08/09/2005 13:18:03

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

signaler à un administrateur
Commentaire de mythic_kruger le 08/09/2005 13:26:17

6 chiffres après la virgule.
L'incident est clos, j'ai du mal lire le premier post.

signaler à un administrateur
Commentaire de Proger le 05/10/2005 14:54:33

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 :)

signaler à un administrateur
Commentaire de Proger le 05/10/2005 14:56:59

oups :
durée = value() - cDelta
et non pas "plus".
ben oui on enlève la durée du traitement propre à la fonction value() ^^

signaler à un administrateur
Commentaire de us_30 le 01/04/2006 14:43:51

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.

signaler à un administrateur
Commentaire de Sergissimo le 19/02/2008 19:24:47

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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

requette dans requette plus de précision [ par steph ] ex:dim rsMaTable as new adodb.recordsetrsDivers.open "Select * from Une_table",cn,adop......dim rsAutreRecordset as new adodb.recordsetrsAutreRecordse Chronomètre [ par Avildar1 ] Bonjour..Je suis dans un dilemme... J'aimerais savoir comment est-il possible d'obtenir les minutes et les secondes exactes de mon chronomètre.Je suis timer : précision < 10 ms, possible ?? [ par airbeu ] Salut, je suis sous XP avec visual basic 5.0Je cherche à déclencher un fonction toutes les millisecondes, or le problème est que la précision de l'int Précision du défilement d'une scrollbar [ par cedemo ] Salut,J'ai enfin réussi à faire marcher une scrollbar ...ajustement à la "form" quelque soit sa taile de départ ...défilement normal lorsqu'on fait gl Savez- vous faire un chrono??? [ par darkphana ] Bonjourje voudrai créer un chronomètre avec une barre de progression qui se modifie par exemple on veut 30 secondes et la barre de progression fait 30 problème sous VBA [ par didine2604 ] C'est moi Didine&nbsp; Bonjour, voil&#224;, je dois cr&#233;er un chronom&#232;tre sous VBA avec un classement de candidats participant &#224; une cou précision sur le mess davt [ par Tonin39 ] voici comment et le fichier ke jouvre <TR style="HEIGHT: 12.75pt" heig Perte de précision [ par DragonBurn ] &nbsp;&nbsp;&nbsp; Salut, je fais un prog ss VB6 qui prend les donn&#233;es que l'utilsateur entrent et qui effectue des calcule de valeur absolue et précision de nombres après calculs [ par AudreyV ] Bonjour, J'aimerais obtenir des résultats avec une précision de 3 chiffres après la virgule. Pour calculer mes résultats, je suis obligée de passer p Timer [ par MouLeT ] Voil&#224; quand on met un Timer sur une Form, on &#224; une pr&#233;cision quasiment au dixi&#232;me. Et comme sur les jeux vid&#233;os&nbsp;je vois


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,577 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.