Delphiで処理速度を計測する

Delphi,OS,Programing,Windows,Windows API

今作ってるプログラムで、ちょっとレスポンスが悪いプロシージャがあったので
プロシージャ内部のどの処理が時間を食ってるのか調べることにした。

何パターンかやり方があるけど、とりあえず簡単なのを。

timeGetTime関数

uses MMSystem;
procedure TimeCheck;
var
time : DWORD;
begin
time := timeGetTime;
{
    測定したい処理
  }
time := timeGetTime - time;
end;

使い方としてはざっくりこんな感じ。
timeGetTime関数とは、Windowsのシステム時刻をミリ秒単位で取得する関数。
戻り値はDWORDで返ってきます。
上記のソースは、測定したい処理の直前の時刻を取得しておき、処理終了後の時刻を再度取得してその差分を計算するという単純なもの。

uses句にMMSystemを追加すれば使えます。
精度としては1msec程度の分解能。WindowsNTに限っていうとマシンによっては5msec以上になることもあるそうな。

DWORD型ということで戻り値は、0~2^32[msec]の間を循環します。
2^32[msec]は49.71日に相当するので、これ以上の時間は測定できません。

50日近く終わらない処理なんて測定することはしないでしょう(

変数timeに最終的な結果が代入されているので、なんかしらの形でこれを出力してやれば結果を見れます。
デバッグ画面から追っていってもいいんじゃないかと。

上記リンク、MSDNを見てもらえれば分かる通り今回はDelphi向けの書き方をしてますが、当然C#C++でも使えます。
文法をそれに合わせるだけ。

基本的には1msec程度の分解能でも十分使えるんだけども、これ以上に細かいところを見たいとなると別の手法になってきます。

QueryPerformanceCounter関数とQueryPerformanceFrequency関数を使うことになるのですが、今回は使わなかったのでまたいずれ。