Trace, debug, performance


Debug hors VBIDE - OutputDebugString

Stored Code

'Déclaration API (très léger) Private Declare Sub ODSAPI Lib "Kernel32" Alias "OutputDebugStringA" (ByVal strOutput As String) 'Envoi la string passée en référence dans le OutputDebugString Public Sub ODS(ByVal strOutput As String) ODSAPI "[" & App.ThreadID & "] - " & strOutput & vbCrLf End Sub

Example

La Sub envoit une string (pour trace, debug...) + le threadID à une API du Kernel. Cette string peut ensuite être capturée et affichée en temps réel à l'aide d'un outil adéquat (par ex. DebugView de Mark Russinovich downloadable gratuitement chez www.sysinternals.com) Très utile pour ne pas dire indispensable afin de debuguer hors contexte "VBIDE" (particulièrement des composants dans MTS).

Mesure du temps d'executions - PerformanceTimer

Stored Code

'------------------------------------------- ' PerformanceTimer class module '------------------------------------------- Option Explicit 'déclarations API Private Declare Function QueryPerformanceFrequencyAny Lib "kernel32" Alias _ "QueryPerformanceFrequency" (lpFrequency As Any) As Long Private Declare Function QueryPerformanceCounterAny Lib "kernel32" Alias _ "QueryPerformanceCounter" (lpPerformanceCount As Any) As Long 'Fréquence du PC Dim frequency As Currency Dim startTime As Currency Dim endTime As Currency Dim totTime As Currency ' Start le timer ' si argument = True -> reset égallement le compteur interne total Sub StartTimer(Optional ByVal ResetTotalTime As Boolean) QueryPerformanceCounterAny startTime If ResetTotalTime Then totTime = 0 End Sub ' stop le timer et retourne le temps écoulé depuis le StartTimer Function StopTimer() As Double StopTimer = ElapsedTime totTime = totTime + (endTime - startTime) startTime = 0 End Function ' return le temps écoulé en secondes depuis le StartTimer sans stoper le Timer Property Get ElapsedTime() As Double If startTime = 0 Then Exit Property QueryPerformanceCounterAny endTime ElapsedTime = (endTime - startTime) / frequency End Property ' retourne le temps total écoulé en secondes Property Get TotalTime() As Double If startTime = 0 Then TotalTime = totTime / frequency Else TotalTime = (totTime + (endTime - startTime)) / frequency End If End Property ' retourne un temps sous la forme d'une string formatée (selon masque) ' si 2ème argument n'est pas spécifié, utiliseElapsedTime ' moins précis que Gettime. Property Get FormatTime(msg As String, Optional seconds As Double = -1, _ Optional ByVal decDigits As Integer = 7) As String If seconds < 0 Then seconds = ElapsedTime() FormatTime = Replace(msg, "###", CStr(Round(seconds, decDigits))) End Property ' retourne la précision du timer en secondes Property Get Precision() As Double Precision = 1 / (frequency * 10000#) End Property ' évalue la précision lors de la création de l'objet Private Sub Class_Initialize() If QueryPerformanceFrequencyAny(frequency) = 0 Then Err.Raise 1001, , "This system doesn't support high-res timing" End If StartTimer End Sub

Example

Copyright DevX CodeBank (PerformanceTimer - A class module for high-resolution time measurement) Cette classe permet d'effectuer des mesures de temps d'execution de code (précision 1 millionième de seconde): - Le Timer débute dès la création de l'objet - il peut être arrêté avec StopTimer (retour du temps écoulé depuis le StartTimer) - il peut être redémarré avec StartTimer - TotalTime retourne le total des temps calculés (après plusieurs arrêt/redémarrage) - FromatTime format selon un masque et une précision désirée Example: Dim pc As New PerformanceCounter pc.StartTimer ' ... ' code à mesurer ' ... ' temps écoulé sans stoper le Timer Debug.Print pc.ElapsedTime ' ... ' code à mesurer ' ... ' temps écoulé en stopant le Timer Debug.Print pc.StopTimer ' ... ' code à mesurer ' ... ' Restart le timer pc.StartTimer ' ... ' code à mesurer ' ... ' temps écoulé formaté Debug.Print pc.FormatTime("Second benchmark ### secs.", 4) ' temps total écoulé Debug.Print pc.TotalTime