UsefullCode.net


Visual Studio 2005/2008/2010やandroid SDK/NDKでの開発者向けに便利なソースコードを提供
This site provide you with useful source codes under 'USEFULLCODE license'.

簡単に処理時間を計測する

2007年03月29日 19:58
2件のコメント

test128.gif
ベンチマークソフトを作りたい!と本格的に思わなくとも処理時間を計測したい場面は多々ある。簡易的に測定したのなら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;
}
プロジェクトファイルをダウンロード
たくさんある文字列比較用関数から必要なものを見つける
DLLなどからエクスポートされている関数を一覧する
2件のコメント
トップページに戻る
issei.