Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA效率测试_Excel_Vba - Fatal编程技术网

Excel 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 +

我找到了一个VBA代码来测试线程中代码的运行时。我实现了,它成功了。但每次我运行一个简单的代码,如下所示,它都会返回不同的结果

我搜索并测试了许多代码,但没有找到我所期望的

是否有一种方法可以测试代码并返回代码所需的时钟数?每次使用下面的代码运行时,都会返回相同的值

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的解决方案。非常感谢。