Есть ли код в VBA, я могу обернуть функцию, которая позволит мне узнать время, которое требуется для запуска, чтобы я мог сравнивать разные времена работы функций?
Как вы проверяете время работы кода VBA?
Ответ 1
Если ваши функции не очень медленные, вам понадобится таймер с очень высоким разрешением. Самый точный, который я знаю, QueryPerformanceCounter
. Google для получения дополнительной информации. Попробуйте нажать следующее в классе, назовите его CTimer
say, тогда вы можете сделать экземпляр где-то глобальным и просто вызвать .StartCounter
и .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
Ответ 2
Функция таймера в VBA показывает количество секунд, прошедших с полуночи, до 1/100 секунды.
Dim t as single
t = Timer
'code
MsgBox Timer - t
Ответ 3
Если вы пытаетесь вернуть время, как секундомер, вы можете использовать следующий API, который возвращает время в миллисекундах с момента запуска системы:
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
после http://www.pcreview.co.uk/forums/grab-time-milliseconds-included-vba-t994765.html (поскольку timeGetTime в winmm.dll не работал у меня, и QueryPerformanceCounter был слишком сложным для требуемой задачи)
Ответ 4
Для новичков эти ссылки объясняют, как выполнять автоматическое профилирование всех подсайтов, которые вы хотите отслеживать во времени:
http://www.nullskull.com/a/1602/profiling-and-optimizing-vba.aspx
http://sites.mcpher.com/share/Home/excelquirks/optimizationlink см. procProfiler.zip в http://sites.mcpher.com/share/Home/excelquirks/downlable-items
Ответ 5
Мы использовали решение на основе timeGetTime в winmm.dll для миллисекундной точности в течение многих лет. См. http://www.aboutvb.de/kom/artikel/komstopwatch.htm
Статья находится на немецком языке, но код в загрузке (класс VBA, завершающий вызов функции dll) достаточно прост, чтобы использовать и понимать, не имея возможности прочитать статью.
Ответ 6
Sub Macro1()
Dim StartTime As Double
StartTime = Timer
''''''''''''''''''''
'Your Code'
''''''''''''''''''''
MsgBox "RunTime : " & Format((Timer - StartTime) / 86400, "hh:mm:ss")
End Sub
Выход:
RunTime: 00:00:02