Как вы тестируете время выполнения кода VBA?

Есть ли код в VBA, с которым я могу обернуть функцию, которая позволит мне узнать время, необходимое для запуска, чтобы я мог сравнить различные времена выполнения функций?

83 голоса | спросил Lance Roberts 13 +04002008-10-13T21:49:02+04:00312008bEurope/MoscowMon, 13 Oct 2008 21:49:02 +0400 2008, 21:49:02

5 ответов


0

Если ваши функции не очень медленные, вам понадобится таймер с очень высоким разрешением. Самый точный из известных мне - QueryPerformanceCounter. Google это для получения дополнительной информации. Попробуйте вставить следующее в класс, назовите его CTimer скажем, тогда вы можете сделать экземпляр где-нибудь глобальным и просто вызвать .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
ответил Mike Woodhouse 13 +04002008-10-13T23:16:17+04:00312008bEurope/MoscowMon, 13 Oct 2008 23:16:17 +0400 2008, 23:16:17
0

Функция таймера в VBA показывает количество секунд, прошедших с полуночи, до 1/100 секунды.

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

Если вам нужно большее разрешение, я просто запустил бы функцию 1000 раз и разделил бы общее время на 1000.

ответил dbb 14 +04002008-10-14T03:51:56+04:00312008bEurope/MoscowTue, 14 Oct 2008 03:51:56 +0400 2008, 03:51:56
0

Если вы пытаетесь вернуть время как секундомер, вы можете использовать следующий 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-миллисекунд-включенный-vba-t994765.html (так как timeGetTime в winmm.dll не работал для меня, а QueryPerformanceCounter был слишком сложным для необходимой задачи)

ответил Kodak 25 J000000Monday11 2011, 21:32:28
0

Для новичков эти ссылки объясняют, как выполнить автоматическое профилирование всех подводных лодок, которые вы хотите отслеживать по времени:

http://www.nullskull.com/a/1602 /профилирование-и-оптимизации-vba.aspx

http://sites.mcpher.com/share/Home/excelquirks/optimizationlink см. procProfiler.zip в http://sites.mcpher.com/share/Home/excelquirks /downlable-пункты

ответил miodf 21 MarpmFri, 21 Mar 2014 19:41:27 +04002014-03-21T19:41:27+04:0007 2014, 19:41:27
0

Мы использовали решение, основанное на timeGetTime в winmm.dll, с точностью до миллисекунды в течение многих лет. См. http://www.aboutvb.de/kom/artikel/komstopwatch.htm

Статья написана на немецком языке, но загружаемый код (класс VBA, заключающий в себе вызов функции dll) достаточно прост для использования и понимания без возможности прочтения статьи.

ответил Tom Juergens 13 +04002008-10-13T23:20:30+04:00312008bEurope/MoscowMon, 13 Oct 2008 23:20:30 +0400 2008, 23:20:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132