ベンチマークソフトを作りたい!と本格的に思わなくとも処理時間を計測したい場面は多々ある。簡易的に測定したのならGetTickCountを利用すると簡単に計測できる。
GetTickCountはPCを起動してからの経過時間をミリ秒単位で返すための関数だ。この関数を計測したい処理の前後に実行して、取得した値の差を取れば処理に要した時間となる。
ただしGetTickCountを利用する上で注意しておきたい点がある。
まず、この関数で返される値は「まれにゼロに戻る」という点だ。具体的には49.7日周期でゼロに戻る。そのため49.7日を超える処理時間は確実に計測できないし、処理時間が仮に数秒の場合でもちょうどゼロに戻るタイミングに当たった場合は処理時間が負の値となりきちんと計測できない。
また、WindowsはマルチタスクOSなため、バックグラウンド処理が重たいと計測時間が長くなるという点だ。これはGetTickCountの欠点ではないが場合によっては問題となり得る。
何はともあれ、「GetTickCountの値がゼロに戻ることがある」という点だけは絶対に頭に入れておかないとダメだ。
#include "atlstr.h"
bool Test()
{
DWORD dwStart;
ULONGLONG dwEnd;
dwStart = ::GetTickCount();
//処理時間を計測したい処理
{
int i;
int j;
for(i = 0; i < 1000; i++)
{
for(j = 0; j < 1000; j++)
{
char pszBuff[256];
::sprintf_s(pszBuff,256 * sizeof(char),"%d %d",i,j);
}
}
}
dwEnd = ::GetTickCount();
//GetTickCountは49.7日に1回ゼロに戻る。
//計測中にゼロに戻っても正常な値になるようにゼロに戻った場合は桁上がりさせる
//※注意:この桁上がり処理をした場合も49.7日を超える時間は計測できない
if(dwStart > dwEnd)
dwEnd += 0x100000000; //桁上がり
CAtlString strMessage;
strMessage.Format(_T("処理にかかった時間は %d ミリ秒です"),dwEnd - dwStart);
::MessageBox(NULL,strMessage,_T(""),MB_OK);
return true;
}
プロジェクトファイルをダウンロード