わんくまライブラリ Wankuma.Interop.InteropQueryPerformanceCounterクラス Version2
この文書はVisual Studio 2003(.NET1.1)をベースに記述されています。それ以降のバージョンや、あなたが読んでいる時点では変更されている可能性があります。
またバージョンアップされている場合にはなんらかかの不具合を含んでいる可能性があります。
ソースファイルへ
Wankuma.Interop.InteropQueryPerformanceCounter2s.htm
ソースファイル直接ダウンロードへ
Wankuma.Interop.InteropQueryPerformanceCounter2c.txt
利用規約へ
../kiyaku.htm
クラスの説明
Windows APIの世界でもっとも細かい単位で(分解能という)時間を計測するにはQueryPerformanceCounterを使います。
[HOW TO] Visual C# .NET で、QueryPerformanceCounter
を使用してコードの時間を計測する方法
http://support.microsoft.com/kb/306979/ja
[HOW TO] Visual Basic .NET で QueryPerformanceCounter
を使用してコードの時間を計測する方法
http://support.microsoft.com/kb/306978/ja
ただしこのKBのままでは使いにくいですので、ラップしました。
Version2の特徴 NEW!
API呼び出しのパフォーマンスを改善しました。LadyBugさん指摘
http://d.hatena.ne.jp/ladybug/20050719#p1
計測途中の現時点の経過時間を計測できるようにしました。(NowResultプロパティ)
メソッドの説明
public void Start()
計測を開始します
public void End()
計測を終了します
プロパティの説明
public long Frequency
分解能を取得します。
public double Result
Start()で計測を開始し、End()までの計測結果を返します。
public double NowResult NEW!
Start()で計測を開始し、現在時点での計測結果を返します
テストコード
C#
//パターン1 正確に開始と終了の間の時間を計測します。 Wankuma.Interop.InteropQueryPerformanceCounter iqpc = new Wankuma.Interop.InteropQueryPerformanceCounter(); iqpc.Start(); //計測を開始します System.Threading.Thread.Sleep(1000); //時間のかかる処理をします Sleep自身に正確な分解能はありませんので、ぴったり1.0ちょっとはなりません iqpc.End(); //計測を終了します double Result = iqpc.Result; System.Diagnostics.Debug.WriteLine(Result); //パターン2 正確さは少し置いといて、開始と現在の間の時間を計測します。 Wankuma.Interop.InteropQueryPerformanceCounter iqpc2 = new Wankuma.Interop.InteropQueryPerformanceCounter(); iqpc2.Start(); //計測を開始します System.Threading.Thread.Sleep(1000); //時間のかかる処理をします Sleep自身に正確な分解能はありませんので、ぴったり1.0ちょっとはなりません System.Diagnostics.Debug.WriteLine(iqpc2.NowResult); System.Threading.Thread.Sleep(1000); //時間のかかる処理をします Sleep自身に正確な分解能はありませんので、ぴったり2.0ちょっとはなりません System.Diagnostics.Debug.WriteLine(iqpc2.NowResult);
VB
'パターン1 正確に開始と終了の間の時間を計測します。 Dim iqpc As Wankuma.Interop.InteropQueryPerformanceCounter = New Wankuma.Interop.InteropQueryPerformanceCounter iqpc.Start() '計測を開始します System.Threading.Thread.Sleep(1000) '時間のかかる処理をします Sleep自身に正確な分解能力はありませんので、ぴったり1.0ちょっとはなりません iqpc.End() '計測を終了します Dim Result As Double = iqpc.Result System.Diagnostics.Debug.WriteLine(Result) 'パターン2 正確さは少し置いといて、開始と現在の間の時間を計測します。 Dim iqpc2 As Wankuma.Interop.InteropQueryPerformanceCounter = New Wankuma.Interop.InteropQueryPerformanceCounter iqpc2.Start() '計測を開始します System.Threading.Thread.Sleep(1000) '時間のかかる処理をします Sleep自身に正確な分解能力はありませんので、ぴったり1.0ちょっとはなりません System.Diagnostics.Debug.WriteLine(iqpc2.NowResult) System.Threading.Thread.Sleep(1000) '時間のかかる処理をします Sleep自身に正確な分解能力はありませんので、ぴったり2.0ちょっとはなりません System.Diagnostics.Debug.WriteLine(iqpc2.NowResult)
結果
0.999512704749288 1.00004705966596 1.99964738762285