2011-08-18 7 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よりも正確なウィンドウ関数を使用しています。それはhttp://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_MakingWorkbooksCalculateFasterから取られます。同じページには、私はその精度のために、好みのdllユーティリティPerfMonが含まれており、それが簡単にメニューのカップルとコード全体で挿入することができますようエクセル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

リンクの腐敗を防ぐために、あなたの答えにリンクのコードを要約してください。また、提供されたマイクロタイマーコードは、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 

こうすることで、あなたが好きな場所あなたのコードを入れて、唯一の(例えば)を2回、それを呼び出すために持つことができますで

If C_DEBUG Then Call Chrono 

テストしたいコードの部分の始めと終わり。

しかし、実際の「正確な」方法はありません。なぜなら、コンピュータ上で実行されているものによっても異なるからです。私は、これらの方法が、どちらのコードがであるかを伝えるのに役立つと言いたいと思います。

2

測定にはノイズが多いため、精度を求めたい場合は、測定を何度も繰り返し、結果を平均します。