web-dev-qa-db-fra.com

Comment testez-vous le temps d'exécution du code VBA?

Existe-t-il du code dans VBA avec lequel je peux encapsuler une fonction qui me permettra de connaître le temps d’exécution, de sorte que je puisse comparer les différentes durées d’exécution des fonctions?

90
Lance Roberts

À moins que vos fonctions ne soient très lentes, vous aurez besoin d'un minuteur à très haute résolution. Le plus précis que je connaisse est QueryPerformanceCounter. Recherche le sur Google pour plus d'informations. Essayez de placer ce qui suit dans une classe, appelez-le CTimer par exemple, vous pouvez alors rendre une instance globale et simplement appeler .StartCounter et .TimeElapsed

Option Explicit

Private Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type

Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long

Private m_CounterStart As LARGE_INTEGER
Private m_CounterEnd As LARGE_INTEGER
Private m_crFrequency As Double

Private Const TWO_32 = 4294967296# ' = 256# * 256# * 256# * 256#

Private Function LI2Double(LI As LARGE_INTEGER) As Double
Dim Low As Double
    Low = LI.lowpart
    If Low < 0 Then
        Low = Low + TWO_32
    End If
    LI2Double = LI.highpart * TWO_32 + Low
End Function

Private Sub Class_Initialize()
Dim PerfFrequency As LARGE_INTEGER
    QueryPerformanceFrequency PerfFrequency
    m_crFrequency = LI2Double(PerfFrequency)
End Sub

Public Sub StartCounter()
    QueryPerformanceCounter m_CounterStart
End Sub

Property Get TimeElapsed() As Double
Dim crStart As Double
Dim crStop As Double
    QueryPerformanceCounter m_CounterEnd
    crStart = LI2Double(m_CounterStart)
    crStop = LI2Double(m_CounterEnd)
    TimeElapsed = 1000# * (crStop - crStart) / m_crFrequency
End Property
78
Mike Woodhouse

La fonction Minuterie de VBA vous donne le nombre de secondes écoulées depuis minuit, à 1/100 de seconde.

Dim t as single
t = Timer
'code
MsgBox Timer - t
44
dbb

Si vous essayez de renvoyer l'heure comme un chronomètre, vous pouvez utiliser l'API suivante, qui renvoie l'heure en millisecondes depuis le démarrage du système:

Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Sub testTimer()
Dim t As Long
t = GetTickCount

For i = 1 To 1000000
a = a + 1
Next

MsgBox GetTickCount - t, , "Milliseconds"
End Sub

after http://www.pcreview.co.uk/forums/grab-time-milliseconds-included-vba-t994765.html (car timeGetTime dans winmm.dll ne fonctionnait pas pour moi et QueryPerformanceCounter était trop compliqué pour la tâche requise)

29
Kodak

Pour les nouveaux abeilles, ces liens expliquent comment effectuer un profilage automatique de tous les sous-marins que vous souhaitez surveiller:

http://www.nullskull.com/a/1602/profiling-and-optimizing-vba.aspx

http://sites.mcpher.com/share/Home/excelquirks/optimizationlink voir procProfiler.Zip dans http://sites.mcpher.com/share/Home/excelquirks/downlable -items

4
miodf

Nous avons utilisé une solution basée sur timeGetTime dans winmm.dll pour une précision à la milliseconde pendant de nombreuses années. Voir http://www.aboutvb.de/kom/artikel/komstopwatch.htm

L'article est en allemand, mais le code dans le téléchargement (une classe VBA enveloppant l'appel de fonction dll) est suffisamment simple pour être utilisé et compris sans pouvoir lire l'article.

2
Tom Juergens