中の技術日誌
 ホーム / 上へ

わんくまライブラリ Wankuma.Interop.InteropQueryPerformanceCounterクラス Version2

2005/07/20

この文書は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

勉強会: 05/18 大阪 登録受付中

中の技術日誌
コンテンツ
わんくま同盟
わんくま同盟
わんくま同盟
広告
バナー
MVP LOGO
MSMVP Visual C# Since 2004/04-2007/03
MCP LOGO
070-316
姉妹サイト
姉妹サイト:じゃんぬのC#, VB.NET 入門
じゃんぬの
C#, VB.NET 入門
検索
Google

ブログ本家
広告