Sergissimo
Messages postés2Date d'inscriptionvendredi 14 avril 2006StatutMembreDerniè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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 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és248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 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:)
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és241Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention10 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és278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 8 sept. 2005 à 11:27
ok. très bon à savoir. thx
PCPT
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és241Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention10 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és241Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention10 novembre 2005 7 sept. 2005 à 22:35
cs_Clem
Messages postés282Date d'inscriptiondimanche 1 avril 2001StatutMembreDernière intervention12 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
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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 7 sept. 2005 à 22:20
tous les Windows, voulais-je dire....
PCPT
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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é)
19 févr. 2008 à 19:24
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.
1 avril 2006 à 14:43
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.
5 oct. 2005 à 14:56
durée = value() - cDelta
et non pas "plus".
ben oui on enlève la durée du traitement propre à la fonction value() ^^
5 oct. 2005 à 14:54
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 :)
8 sept. 2005 à 13:26
L'incident est clos, j'ai du mal lire le premier post.
8 sept. 2005 à 13:18
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
8 sept. 2005 à 11:27
PCPT
8 sept. 2005 à 08:48
8 sept. 2005 à 01:01
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
8 sept. 2005 à 00:07
Ces APIs de haute résolution sont présentes depuis NT 3.1, on peut donc considérer dispo sur tous les Windows.
7 sept. 2005 à 23:23
7 sept. 2005 à 23:09
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.
7 sept. 2005 à 22:35
http://www.vbfrance.com/article.aspx?ID=9523
7 sept. 2005 à 22:23
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 :)
7 sept. 2005 à 22:20
PCPT
7 sept. 2005 à 22:16
non c'est pour Windows donc se servir de l'API est normal, non ?
7 sept. 2005 à 22:04
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