高分辨率定时器/代码运行时间 – >开销?

我试图find我的代码运行时间使用高分辨率计时器,我注意到,计时器有不一致的结果,我想知道为什么这是。

我发现这篇文章如何testingVBA代码的运行时间?
并已经实现了最高的答案,我试着用它来查找几个函数的运行时间,并注意到结果变化相当剧烈。

看看这是否是定时器的错误,我做了一个function,我刚刚开始和停止计时器。

Public Sub test_ctimer() Dim results(0 To 4) As Double Dim t As CTimer: Set t = New CTimer Dim i As Integer 'Removes msg box overhead MsgBox "about to start" For i = 0 To 4 t.StartCounter results(i) = t.TimeElapsed Next i For i = 0 To 4 MsgBox results(i) Next i End Sub 

第一次测量比以下任何测量需要更多的时间(大一个数量级)。 有人知道为什么吗?

下面是你如何testingVBA代码的运行时间的ctimer 代码?

 Option Explicit Private Type LARGE_INTEGER lowpart As Long highpart As Long End Type Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long Private m_CounterStart As LARGE_INTEGER Private m_CounterEnd As LARGE_INTEGER Private m_crFrequency As Double Private Const TWO_32 = 4294967296# ' = 256# * 256# * 256# * 256# Private Function LI2Double(LI As LARGE_INTEGER) As Double Dim Low As Double Low = LI.lowpart If Low < 0 Then Low = Low + TWO_32 End If LI2Double = LI.highpart * TWO_32 + Low End Function Private Sub Class_Initialize() Dim PerfFrequency As LARGE_INTEGER QueryPerformanceFrequency PerfFrequency m_crFrequency = LI2Double(PerfFrequency) End Sub Public Sub StartCounter() QueryPerformanceCounter m_CounterStart End Sub Property Get TimeElapsed() As Double Dim crStart As Double Dim crStop As Double QueryPerformanceCounter m_CounterEnd crStart = LI2Double(m_CounterStart) crStop = LI2Double(m_CounterEnd) TimeElapsed = 1000# * (crStop - crStart) / m_crFrequency End Property 

链接的类不是很好。 有一个开销与调用QueryPerformanceCounter相关联,开销应先确定,然后用于调整后续调用。 这可以解释所有的结果比预期的要慢一些但是它并不能解释第一个结果实际上比较慢 。 无论如何,请参阅http://support.microsoft.com/kb/172338描述了一个调整它的方法&#x3002; 我已经实现的class级目前无法访问,因此无法发布相关部分。

另外对于与您的具体问题无关的阅读,但通常与Windows上的计时相关, http://msdn.microsoft.com/en-gb/library/windows/desktop/dn553408%28v=vs.85%29.aspx很有意&#x601D;

作为一个解决方法,同时,添加一个调用开始,然后停在Class_Initialize。

这根本不是一个真正的答案 – 更多的是一个扩展的评论 – 所以我会编辑它,如果我find一个决定性的理由;)

重申那些强调:我不能解释OP所查询结果的原因。 我假设这是与VBA解释器(即接近JIT'er),但我不能以任何方式证据。 我上面的评论与OP正在使用的function有关,但可能并非如此。