2005年08月03日

Windowsの高分解能タイマを利用し処理時間を計測する方法

あなたが業務でプログラミングを行う場合、
パフォーマンスをシビアに
要求される局面は多々あるかと思います。
闇雲にプログラムをチューニングし、
時間の無駄使いをしないためにも、
ボトルネックとなる処理を
効率よく洗出し対処することが重要になります。

処理が遅いアプリケーションを調査すると、
ほとんどの場合、2割のボトルネックが
遅い原因の8割を占めるという結論に至ります。
効率よく処理速度を向上するには、
この2割のボトルネックにメスを入れ、
他の8割はホドホドに対応するのが良いでしょう。
また運用フェーズなどでは
長期的なパフォーマンスの集計を行い、
パフォーマンスの低下がないか調べる必要もあるでしょう。

というわけで、
今回はプログラムの処理時間を計測する方法をご紹介します。
あなたのプログラムに組み込んで処理時間を計測してください。

計測方法はとても簡単です。
「QueryPerformanceFrequency」API関数を呼び出し、
高分解能パフォーマンスカウンタの
カウンタ周波数を取得します。
計測したい処理の前後で
「QueryPerformanceCounter」API関数を呼び出し、
高分解能パフォーマンスカウンタの値をそれぞれ取得します。
取得したカウンタ値の差を1000倍しカウンタ周波数で
割ってやると処理時間がミリ秒の単位で計測できます。

インストール先のハードウェアが
高分解能パフォーマンスカウンタをサポートしない場合、
関数は0を戻し計測できませんので注意が必要です。

使用例
procedure TForm1.Button1Click(Sender: TObject);
 procedure _Loop;
 var
  lCnt1,
  lCnt2,
  lCnt3: Integer;
 begin
  lCnt3 := 0;
  for lCnt1 := 1 to 10000 do
   for lCnt2 := 1 to 10000 do
    Inc(lCnt3);
 end;
var
 lSPoint,
 lEPoint,
 lFrequency: TLargeInteger;
 lElapse: Double;
begin
 // カウンタ周波数を取得します
 QueryPerformanceFrequency(lFrequency);
 // 計測開始のカウンタ値を取得します
 QueryPerformanceCounter(lSPoint);
 // 計測対象の処理です
 // 10000*10000回のループ処理を実行します
 _Loop;
 // 計測終了のカウンタ値を取得します
 QueryPerformanceCounter(lEPoint);
 // 経過時間をミリ秒単位で算出します。
 lElapse := 1000 * (lEPoint - lSPoint) / lFrequency;
 ShowMessage(Format(
  '経過時間 = %.2f (ms)', [lElapse]));
end;

関連書籍


Copyright guy@かしらもんじ でぇ〜

posted by guy at 07:01 | 運用管理編
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。