Бенчмаркинг кода VBA
Что считается самым точным способом тестирования кода VBA (в моем случае, я тестирую код в Excel)? Существуют ли какие-либо другие методы для бенчмаркинга, кроме второго, и если да, то каковы преимущества/недостатки метода?
Вот два популярных метода.
Во-первых: Таймер
Sub TimerBenchmark()
Dim benchmark As Double
benchmark = Timer
'Do your code here
MsgBox Timer - benchmark
End Sub
И Тик (который я считаю наиболее точным):
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub TickBenchmark()
Dim Start As Long
Dim Finish As Long
Start = GetTickCount()
'Do your code here
Finish = GetTickCount()
MsgBox CStr((Finish - Start) / 1000)
End Sub
Ответы
Ответ 1
Следующий код использует функцию Windows, более точную, чем Excel. Он взят из http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_MakingWorkbooksCalculateFaster. На той же странице также содержатся некоторые полезные советы по повышению производительности в Excel 2007.
Private Declare Function getFrequency Lib "kernel32" _
Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare Function getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long
Function MicroTimer() As Double
'Returns seconds.
Dim cyTicks1 As Currency
Static cyFrequency As Currency
MicroTimer = 0
' Get frequency.
If cyFrequency = 0 Then getFrequency cyFrequency
' Get ticks.
getTickCount cyTicks1
' Seconds
If cyFrequency Then MicroTimer = cyTicks1 / cyFrequency
End Function
Ответ 2
Интересный вопрос. На самом деле это не полный ответ, но это слишком долго, чтобы его можно было разместить в качестве комментария.
Я использую такую процедуру:
Option Explicit
Public Time As Double
Sub Chrono()
If Time = 0 Then
Time = Now()
Else
MsgBox "Total time :" & Application.Text(Now() - _
Time, "mm:ss") & "." 'or whatever if not a msgbox
Time = 0
End If
End Sub
Таким образом, вы можете поместить свой код туда, где хотите, и его нужно только дважды вызвать (например):
If C_DEBUG Then Call Chrono
В начале и в конце части кода вы хотите протестировать.
Тем не менее, я бы сказал, что нет реального "точного" метода, потому что он также зависит от того, что работает на вашем компьютере. Я бы сказал, что эти методы в основном помогут определить, какой код лучше другого.
Ответ 3
Любое измерение будет шумным, поэтому, если вам нужна точность, повторите измерение многократно и усредните результат.
Ответ 4
Professional Excel Development содержит утилиту dll PerfMon
, которую я предпочитаю, с ее точностью, и поскольку ее можно легко вставить в код с помощью несколько кликов по меню