Excel VBA代码的基准测试
对VBA代码进行基准测试的最准确的方法是什么(在我的例子中,我是在Excel中测试代码)?除了下面的2项,还有其他的基准测试代码的技术吗?如果有,这种方法的优缺点是什么 这里有两种流行的方法 第一个:计时器Excel VBA代码的基准测试,excel,optimization,vba,benchmarking,Excel,Optimization,Vba,Benchmarking,对VBA代码进行基准测试的最准确的方法是什么(在我的例子中,我是在Excel中测试代码)?除了下面的2项,还有其他的基准测试代码的技术吗?如果有,这种方法的优缺点是什么 这里有两种流行的方法 第一个:计时器 Sub TimerBenchmark() 双精度基准 基准=计时器 '在此处执行您的代码 MsgBox定时器-基准测试 端接头 和勾选(我认为这是最准确的): 有趣的问题。这不是一个完整的答案,但太长,无法作为评论发布。 我使用的是这种程序: Option Explicit Public
Sub TimerBenchmark()
双精度基准
基准=计时器
'在此处执行您的代码
MsgBox定时器-基准测试
端接头
和勾选(我认为这是最准确的):
有趣的问题。这不是一个完整的答案,但太长,无法作为评论发布。
我使用的是这种程序:
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
这样,您就可以将代码放在任何地方,只需调用两次(例如):
在要测试的代码部分的开头和结尾
然而,我要说的是,没有真正的“精确”方法,因为它还取决于您的计算机上运行的是什么。我想说,这些方法在很大程度上有助于判断哪种代码比另一种代码更好。任何测量都会有噪音,因此,如果您想要精确,请重复测量多次,并对结果进行平均。以下代码使用了比Excel更精确的windows函数。它是从一个地方取来的。同一页还包含一些关于改进Excel2007性能的好技巧
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
包含一个dll实用程序
PerfMon
,我更喜欢它,因为它的准确性,而且只需点击几下菜单,它就可以轻松地插入整个代码中,该文章的作者是Stackoverflow的经常参与者。他自己的网站上有很多关于Excel和性能的信息:你能在回答中总结一下链接中的代码以防止链接腐烂吗?此外,提供的microtimer代码似乎无法在64位Excel上运行。64位用户有其他选择吗?@StockB FWIW,在Declare
和Function
之间添加PtrSafe
,用于在64位MS Office中声明API函数。
If C_DEBUG Then Call Chrono
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