2011-08-18 95 views
13

什麼被認爲是最準確的基準VBA代碼的方法(在我的情況下,我在Excel中測試代碼)?除了下面的2之外,還有其他用於對比代碼的其他技術嗎?如果是,那麼該方法的優點/缺點是什麼?基準VBA代碼

這裏有2種流行的方法。

第一:定時器

Sub TimerBenchmark() 

Dim benchmark As Double 
benchmark = Timer 

'Do your code here 

MsgBox Timer - benchmark 

End Sub 

而且(我看到認爲是最準確):

Option Explicit 
Private Declare Function GetTickCount Lib "kernel32"() As Long 

Sub TickBenchmark() 

Dim Start As Long 
Dim Finish As Long 

Start = GetTickCount() 

'Do your code here 

Finish = GetTickCount() 
MsgBox CStr((Finish - Start)/1000) 

End Sub 

回答

13

以下代碼使用比Excel更精確的windows函數。它取自http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_MakingWorkbooksCalculateFaster。同樣的頁面還包含在Excel上提高性能的一些偉大的祕訣2007年

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

此鏈接是黃金!謝謝! – aevanko

+1

該作者的作者是Stackoverflow的定期撰稿人。他自己的網站有很多關於Excel和性能的很好的信息:http://www.decisionmodels.com/ – jtolle

+1

您能否在您的答案的鏈接中總結代碼以防止鏈接腐爛?此外,提供的microtimer代碼似乎不適用於64位Excel。有沒有64位用戶的替代品? – StockB

6

有趣的問題。這並不是一個完整的答案,但是這太長了,無法發表評論。
我用的是這種程序:

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 

這樣的話,你可以把你的代碼,無論你想,只需要調用它兩次(例如):

If C_DEBUG Then Call Chrono 

在在您想要測試的部分代碼的開始和結尾。

然而,我會說沒有真正的「準確」的方法,因爲它也取決於您的計算機上運行的是什麼。我會說這些方法將主要幫助告訴哪些代碼是更好比另一個。

2

任何測量都會產生噪音,所以如果您需要精確度,請多次重複測量並對結果取平均值。