2009-04-20 10 views
4

特定の機能がどれくらいの期間使用されているかを素早く測定したい場合は、正確なタイミングを得るために何を呼び出す必要がありますか? VB6のタイミング関数が高精度ではないことを考えれば、代わりに呼び出すWindows API関数がありますか?VB6でタイミング機能/性能測定の最善の方法は何ですか?

他にどのような方法でアプリケーションのパフォーマンスを測定しますか?推奨するサードパーティのツールはありますか?

答えて

4

通常、Windowsの解像度パフォーマンスカウンタを使用します。チェックアウトQueryPerformanceCounterQueryPerfomanceFrequency

通常、私は単純なクラスを持ち、そのコンストラクタとデストラクタはQueryPerformanceCounterを呼び出し、実行中の合計に差を加えます。

ツールの場合devpartnerをご確認ください。それがうまくいく間に、コードのかなりの部分を装備することで、私のアプリケーションは驚くほど遅く動作します。私は通常、1つか2つの関数で正確なタイミングを得たいと思っているので、パフォーマンスカウンタ機能を使い、devpartnerを使わないことがよくあります。

+0

あなたはQPCを使用してVB6のコードを投稿することができ、任意のチャンス? LARGE_INTEGERを宣言して使用する方法について私は興味があります。私は "VBの男"ではない。 –

+1

私はこれを見つけました。非常に便利です:http://support.microsoft.com/kb/172338 – Gavin

+0

devpartnerへのリンクが壊れています。私は会社が製品を引退したかどうか疑問に思います。 – TheCrazyProgrammer

1

VB Watchあなたが検討したいと思うかもしれないもう一つのツールです。

これらは、コードの疑わしい領域を分離できる場合に最も汎用性があります。このタイプの多くのツールでは、コードインストゥルメンテーションの適用範囲をモジュールまたは個々のプロシージャに限定したり、ステートメントレベルではなくプロシージャに制限したりできます。これは、プログラム全体の行単位計測に伴う痛みを軽減するのに役立ちます。

4

私は、高性能マルチメディアタイマを使用しています。以下はデバッグ プロファイリングライブラリのスニペットです。

Private Declare Function timeGetTime Lib "winmm.dll"() As Long 
Private Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long 
Private Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long 

Private mlTimeStarted As Long 


Public Sub StartTimer(Optional lPeriod As Long = 1) 
10  Call timeBeginPeriod(lPeriod) 
20  mlTimeStarted = timeGetTime() 
End Sub 

Public Function GetTimeElapsed() As Long 
10  GetTimeElapsed = timeGetTime() - mlTimeStarted 
End Function 

Public Sub EndTimer(Optional lPeriod As Long = 1) 
    Debug.Assert lPeriod < 10 
10  Call timeEndPeriod(lPeriod) 
20  mlTimeStarted = 0 
End Sub 

Public Sub DebugProfileStop() 
10  Call EndTimer 
End Sub 

Public Sub DebugProfileReset() 

10  If mlTimeStarted > 0 Then 
20   EndTimer 
30  End If 
40  Call StartTimer 

End Sub 

Public Sub DebugProfile(sText As String) 
10  Debug.Print "Debug " & sText & " : " & CStr(GetTimeElapsed) 
End Sub 

使用法:

DebugProfileReset 
    DebugProfile("Before Loop") 
    For index = 0 to 10000 
     DebugProfile("Before Call To Foo") 
     Foo 
     DebugProfile("Before Call To Bar") 
     Bar 
     DebugProfile("Before Call To Baz") 
     Baz 
    Next index 
    DebugProfile("After Loop") 
    DebugProfileStop 
+0

本当に面白いですね。 QueryPerformanceCounterを使用するよりもはるかに簡単ですが、私はすでにそのような方法でソリューションを実装しています。ありがとう。 – Gavin

+0

これは私がタイミングに使用する方法論でもあります。シンプルでうまくいく。 – Joe

関連する問題