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?
À 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
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
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)
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
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.