Excel VBA效率测试
我找到了一个VBA代码来测试线程中代码的运行时。我实现了,它成功了。但每次我运行一个简单的代码,如下所示,它都会返回不同的结果 我搜索并测试了许多代码,但没有找到我所期望的 是否有一种方法可以测试代码并返回代码所需的时钟数?每次使用下面的代码运行时,都会返回相同的值Excel VBA效率测试,excel,vba,Excel,Vba,我找到了一个VBA代码来测试线程中代码的运行时。我实现了,它成功了。但每次我运行一个简单的代码,如下所示,它都会返回不同的结果 我搜索并测试了许多代码,但没有找到我所期望的 是否有一种方法可以测试代码并返回代码所需的时钟数?每次使用下面的代码运行时,都会返回相同的值 Sub teste_tempo() Dim eficiencia As New Ctimer eficiencia.StartCounter For i = 0 To 10 i = i +
Sub teste_tempo()
Dim eficiencia As New Ctimer
eficiencia.StartCounter
For i = 0 To 10
i = i + 1
Next i
MsgBox eficiencia.TimeElapsed & "[ms]"
End Sub
首先,我没有设计这段代码。我把它收藏在我的精品收藏中。所有的信用都必须归于创造者。我在很多地方都找到了。。。 请尝试此操作并比较结果:
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function getFrequency Lib "kernel32" Alias _
"QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare PtrSafe Function getTickCount Lib "kernel32" Alias _
"QueryPerformanceCounter" (cyTickCount As Currency) As Long
#Else
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
#End If
Public Function MicroTimer() As Double
' returns seconds from Windows API calls (high resolution timer)
Dim cyTicks1 As Currency, cyTicks2 As Currency
Static cyFrequency As Currency
MicroTimer = 0
If cyFrequency = 0 Then getFrequency cyFrequency
' get ticks
getTickCount cyTicks1
getTickCount cyTicks2
' calc seconds
If cyFrequency Then MicroTimer = cyTicks2 / cyFrequency
End Function
并以下一种方式使用它:
Sub teste_tempo()
Dim i As Long, dTime As Double
dTime = MicroTimer
For i = 0 To 100000000
i = i + 1
Next i
MsgBox (MicroTimer - dTime) * 1000 & " [ms]"
End Sub
但是,它将永远不会回来完全相同的时间!。处理的窗口在不同的时间以不同的百分比加载CPU和RAM。差异将越来越小,与迭代次数成反比。还有哪些进程正在运行?您对
Ctimer
使用什么参考?你有类模块吗?对于这样一个小任务,任何方法都会返回巨大的差异。尝试i=0到100000000的。。。由于Windows进程在不同时刻加载CPU的方式不同,因此也会有差异。我可以提供一个名为
的微型计时器我用来测试执行同一任务的不同方法…我发布了一个精确的时间测量方法,但它永远不会返回相同的传递时间。这不是它的错。。。只需将其回报与您现在使用的回报进行比较。您没有在代码中指定Ctimer的含义…您好!还活着吗?谢谢你@FaneDuru,但我想我还不够清楚。我试图为同一个任务编写不同的代码,以检查哪一个更“有效”。为了做到这一点,在更公平的测试条件下,我正在搜索VBA来测量每个VBA宏执行任务所需的时钟数(或其他度量,但不是时间)。@Carlos Matioli:您能定义“时钟数”的含义吗?我使用上述方法测试所有代码解决方案,以查看哪个变体更快。只需在上述部分中写入一次,并在每个代码的开头和结尾的消息中仅使用dTime=MicroTimer
,以确定代码速度。除了它的运行速度,你还想测试什么呢?如果我有这样的要求,我很抱歉(至少在我的头脑里,我是这样做的)。所谓“时钟数”,我指的是处理器完全执行宏所需的计算数。类似于Windows任务管理器中的CPU使用情况。作为参考,请参阅此链接表中的最后两列。由于我认为我所希望的没有解决方案,因此我将使用@FaneDuru的解决方案。非常感谢。