Excel VBA代码的基准测试

Excel VBA代码的基准测试,excel,optimization,vba,benchmarking,Excel,Optimization,Vba,Benchmarking,对VBA代码进行基准测试的最准确的方法是什么(在我的例子中,我是在Excel中测试代码)?除了下面的2项,还有其他的基准测试代码的技术吗?如果有,这种方法的优缺点是什么 这里有两种流行的方法 第一个:计时器 Sub TimerBenchmark() 双精度基准 基准=计时器 '在此处执行您的代码 MsgBox定时器-基准测试 端接头 和勾选(我认为这是最准确的): 有趣的问题。这不是一个完整的答案,但太长,无法作为评论发布。 我使用的是这种程序: Option Explicit Public

对VBA代码进行基准测试的最准确的方法是什么(在我的例子中,我是在Excel中测试代码)?除了下面的2项,还有其他的基准测试代码的技术吗?如果有,这种方法的优缺点是什么

这里有两种流行的方法

第一个:计时器

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