Classe chronomètre haute précision

Soyez le premier à donner votre avis sur cette source.

Vue 17 055 fois - Téléchargée 838 fois

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 / Exemple :


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!

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
vendredi 14 avril 2006
Statut
Membre
Dernière intervention
4 novembre 2014

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.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008

oups :
durée = value() - cDelta
et non pas "plus".
ben oui on enlève la durée du traitement propre à la fonction value() ^^
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008

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 :)
Messages postés
241
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
10 novembre 2005

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.