patricktoulon
XLDnaute Barbatruc
Bonjour à tous
depuis deux jour dans mes élucubration vbaistique sur le dialog et les fonction dir et fso et tout le toutim
et ayant apprécié la solidité du test benchmark (lien donné par @jurassic pork ) afin d'optimiser le code pour réduire le temps d’exécution
je me suis dis je vais faire mon propre timer tout en pouvant imbriquer des starts et stops
afin de contrôler
à plusieurs endroit d'une sub ou fonction la durée du d’exécution du code
dans chaque fonction appelé par une sub (donc appels et sortie imbriqués)
et cela sans utiliser de module classe
comme pour le test benchmark on le démarre et on l'arrête
'Démarrer la mesure placez cette ligne juste avant la ligne ou vous voulez commencer la mesure dans votre sub ou fonction
StartExecTimeMonitoring [chaine de texte pour taguer le start"] , [ report(variable globale)] , [variable globale tableau] , [ index du tableau)
'Arrêter la mesure : placez cette ligne juste après la ligne ou vous voulez terminer la mesure t dans votre sub ou fonction
StopExecTimeMonitoring [chaine de texte pour taguer le Stop"] , [ report(variable globale)] , [variable tableau] , [ index du tableau)
dites moi ce que vous en pensez ?
j'ai mis deux variantes de sub de tests pour tester
voila un exemple de résultat dans le cadre de start et stop imbriqués avec cumul des mesures
depuis deux jour dans mes élucubration vbaistique sur le dialog et les fonction dir et fso et tout le toutim
et ayant apprécié la solidité du test benchmark (lien donné par @jurassic pork ) afin d'optimiser le code pour réduire le temps d’exécution
je me suis dis je vais faire mon propre timer tout en pouvant imbriquer des starts et stops
afin de contrôler
à plusieurs endroit d'une sub ou fonction la durée du d’exécution du code
dans chaque fonction appelé par une sub (donc appels et sortie imbriqués)
et cela sans utiliser de module classe
comme pour le test benchmark on le démarre et on l'arrête
'Démarrer la mesure placez cette ligne juste avant la ligne ou vous voulez commencer la mesure dans votre sub ou fonction
StartExecTimeMonitoring [chaine de texte pour taguer le start"] , [ report(variable globale)] , [variable globale tableau] , [ index du tableau)
'Arrêter la mesure : placez cette ligne juste après la ligne ou vous voulez terminer la mesure t dans votre sub ou fonction
StopExecTimeMonitoring [chaine de texte pour taguer le Stop"] , [ report(variable globale)] , [variable tableau] , [ index du tableau)
dites moi ce que vous en pensez ?
j'ai mis deux variantes de sub de tests pour tester
VB:
'*****************************************************************************************************
' ___ _ _______ __ _ ____ _ _ _______ ___ _ _ _ ___ _ _.
' // \\ /\\ // // \\ // // // // // // \\ // // // // \\ //| //
' //___// //__\ // //__// // // //__// // // // // // // // // // | //
' // // \\ // // \\ // // // \\ // // // // // // // // // | //
'// // // // // // // //___ // \\ // \\__// //__// //___ \\__// // |//
'****************************************************************************************************
' FONCTION TIMER AMELIOREE
' cette fonction permet une mesure plus precise que le timer de vba
' elle peut imbriquer des demarrages et sorties
' tres pratique quand nous avons des fonction qui sont dépendantes entre elles
' ca permet de mieux voir ou ca rallenti
'le tout en un seul raport dans un msgbox
'Auteur: patricktoulon
'version 1.0
'date version: 19/10/2024
#If VBA7 Then
Private Declare PtrSafe Function QueryPerformanceCounter Lib "Kernel32" (x As Currency) As Boolean
Private Declare PtrSafe Function QueryPerformanceFrequency Lib "Kernel32" (x As Currency) As Boolean
#Else
Private Declare Function QueryPerformanceCounter Lib "Kernel32" (x As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "Kernel32" (x As Currency) As Boolean
#End If
Dim debut(1 To 30) As Currency
Dim Fin(1 To 30) As Currency
Dim Freq As Currency
Dim res As Double
Dim report As String
Sub StartExecTimeMonitoring(ByVal lTag As String, ByRef report As String, ByRef debut() As Currency, index As Integer)
' Démarrer le chronométrage
If index = 1 Then Freq = 0: report = "" 'réinitialisation des variables freq et report si index=1
If Freq = 0 Then QueryPerformanceFrequency Freq
QueryPerformanceCounter debut(index)
report = report & vbCrLf & lTag
End Sub
Sub StopExecTimeMonitoring(ByVal lTag As String, ByRef report As String, ByRef debut() As Currency, index As Integer)
QueryPerformanceCounter Fin(index)
res = (Fin(index) - debut(index)) / Freq
Dim unit As String
' Sélection de la bonne unité
Select Case res
Case Is >= 1: res = Round(res, 3): unit = " s"
Case 0.001 To 0.999999: res = Round(res * 1000, 0): unit = " ms"
Case Else: res = Round(res * 1000000, 0): unit = " µs"
End Select
' Compléter le rapport avec les informations de fin
report = report & vbCrLf & lTag & " => " & vbTab & res & unit
End Sub
'****************************************************************************************************************************************
Sub test()
' Lancer le chronométrage pour la Sub test
StartExecTimeMonitoring "démarrage de la sub test", report, debut, 1
x = mafonction
StopExecTimeMonitoring "fin de la sub test", report, debut, 1
' Afficher le rapport
MsgBox report
End Sub
Sub testcumul()
' Lancer le chronométrage pour la Sub test
StartExecTimeMonitoring "démarrage de la sub test", report, debut, 1
x = mafonction
y = mafonction2
StopExecTimeMonitoring "fin de la sub test", report, debut, 1
' Afficher le rapport
MsgBox report
End Sub
Function mafonction()
' Lancer le chronométrage pour la fonction mafonction
StartExecTimeMonitoring "démarrage du calcul de la fonction", report, debut, 2
For i = 1 To 100000000: Next i
StopExecTimeMonitoring "fin de calcul de la fonction 'mafonction'", report, debut, 2
End Function
Function mafonction2()
' Lancer le chronométrage pour la fonction mafonction
StartExecTimeMonitoring "démarrage du calcul de la fonction 'mafonction2'", report, debut, 2
For i = 1 To 10000000: Next i
StopExecTimeMonitoring "fin de calcul de la fonction 'mafonction2'", report, debut, 2
End Function