Temps d'execution d'un bout de code (benchmark pour optimisation)

Soyez le premier à donner votre avis sur cette source.

Vue 8 474 fois - Téléchargée 7 680 fois

Description

Bonjour à tous,

Voilà j'ai fait cette source car, n'étant pas spécialement un pro de l'optimisation, cela me permet de déterminer quelle partie d'un bout de code prend le plus de temps à s'executer et si je peux l'améliorer.

Il y a 2 projets :

-Le premier est un exe standard, ouvrez le et placez le bout de code que vous voulez tester dans le module, dans la fonction (tout est expliqué). Lancez le programme, sélectionnez le nombre d'itérations et vous verrez alors le temps d'execution du code en millisecondes. Libre à vous après d'essayer d'améliorer la rapidité de votre code et de re-tester.
Avantage : vous pouvez parametrer le nombre d'itérations et modifier le code en dehors de votre programme, mais vous etes obligé de copier le code

-Le second est un ocx. Générez-le. Ensuite dans votre programme, insérez le sur votre form (après l'avoir ajouté parmis vos controles).
Il y a 2 méthodes à appeler : BenchStart (au début du code à mesurer),BenchStop (à la fin). Vous pouvez alors récupérer le temps écoulé grace à la propriété "Interval".
Avantage : pas besoin de copier le code ailleurs, le benchmark s'insère directement dans votre projet. Très simple à utiliser, mais cela ne permet pas de faire plusieurs itérations (ou alors il faut le faire vous meme)

Conclusion :


Comme d'ab, en espérant que ça serve à quelqu'un ;)
MadMatt

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_jym
Messages postés
115
Date d'inscription
lundi 31 décembre 2001
Statut
Membre
Dernière intervention
15 avril 2014
-
bjr,

moi j'apprécie votre code car il me dépanne bien.

j'ai fait des essais avec l'ocx et c'est pas mal du tout pour ce que je veux faire. la précision me suffit pour améliorer des boucles et des itérations successives. j'avais un code un peu empirique et pas trop structuré. ce genre de test me suffit amplement.

merci à vous.

jym
Cacophrene
Messages postés
263
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
4 mars 2008
-
Salut !

Si on considère une feuille avec 4 OptionButton sous forme d'un groupe de contrôle pour indiquer les unités disponibles (Item 0 -> secondes ; Item 1 -> millisecondes...), on pourrait par exemple obtenir (dans un module) assez grossièrement :

'========================================================
'--------------------------DECLARATIONS

'Type grand entier.
Private Type LARGE_INTEGER
LowPart As Long
HighPart As Long
End Type

'Evaluer le temps d'exécution d'un programme
Private Declare Function QueryPerformanceCounter _
Lib "kernel32" ( lpPerformanceCount As LARGE_INTEGER) _
As Long

'Fréquence du compteur de Windows.
Private Declare Function QueryPerformanceFrequency Lib _
"kernel32" (lpFrequency As LARGE_INTEGER) As Long

'Temps initial (au lancement du chronomètre)
Dim SwitchOn As LARGE_INTEGER
'Temps final (à l'arrêt du chronomètre)
Dim SwitchOff As LARGE_INTEGER
'Fréquence du compteur de Windows
Dim Frequency As LARGE_INTEGER

'--------------------------FONCTIONS

'Temps mis pour exécuter une fonction Test.
Private Function GetTime() As String
Dim dCoeff As Double, sUnit As String
Select Case SelectedItem()
Case 0 'secondes
sUnit = " s"
dCoeff = 1
Case 1 'millisecondes
sUnit = " ms"
dCoeff = 10 ^ 3
Case 2 'microsecondes
sUnit = " µs"
dCoeff = 10 ^ 6
Case 3 'nanosecondes
sUnit = " ns"
dCoeff = 10 ^ 9
End Select
GetTime = CStr(dCoeff * (CDbl(SwitchOff.LowPart) _
- CDbl(SwitchOn.LowPart)) / CDbl(Frequency.LowPart)) _
& sUnit
End Function

'Calcule le résultat d'une fonction Test (quelconque)
Private Function GetResult() As Variant
Call QueryPerformanceFrequency(Frequency)
Call QueryPerformanceCounter(SwitchOn)
GetResult = Test
Call QueryPerformanceCounter(SwitchOff)
End Function

'Dans un groupe de contrôles, choix de l'OptionButton
'sélectionné
Private Function SelectedItem() As Integer
Dim k As Integer
SelectedItem = -1
Do
If OPT(k).Value Then SelectedItem = k
k = k + 1
Loop Until (SelectedItem > -1) Or (k > OPT.UBound)
End Function

'========================================================

Comme ça on peut choisir l'unité de mesure la plus appropriée au type de calcul à effectuer.

Cordialement,
Cacophrène
Cacophrene
Messages postés
263
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
4 mars 2008
-
Salut !

Oulà... Laisse tomber la deuxième suggestion. Ce que j'ai écrit ce matin (message du 12/08/2006 07:10:47) ne veut rien dire.

Cordialement,
Cacophrène
MadM@tt
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
-
Ok c'est fait, regardez la capture pour voir les modifications.
Enfin cette modif sera beaucoup plus utile pour l'ocx, car avec l'ocx on execute qu'une fois le code à mesurer donc il faut un compteur très précis.
Par contre, en ce qui concerne le fait de réaliser le test plusieurs fois, je ne vois pas la différence entre augmenter le nombre d'itération ?? Plutot que de réaliser 10 fois le test, par exemple, j'execute 10000 fois la fonction au lieu de 1000, et je décale la virgule.
Enfin si vraiment il y en a besoin je le rajoute ;)
Merci à vous 2
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Sers toi de cela:
http://www.vbfrance.com/code.aspx?id=18494
et tu liras les ticks cpu pour une vraie mesure fine.

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.