在寫與性能相關的應用程序時,經常需要測代碼的運行時間,聽說Intel Compiler下面用VTune可以做得很好,可惜不會用,受Matlab下的Tic,Toc語句的啟發,寫了一些類似的函數,希望可以實現這樣的功能

HBENCHMARK?hid;
Tic(hid);
// ??some?code
Toc(hid);
// ??show?time

如果要測的代碼是一個循環體的一部分,又希望測得總時間,像下面這樣

HBENCHMARK?hid;
Tik(hid);
while()
{
????
//??some?code
????Trk(hid);
????
//??code?to?benchmark
????Tsk(hid);
????
//??some?code
}

Tok(hid);
//??show?time

這里的Trk表示恢復計時,Tsk表示暫停計時,Tok里面包括了停止計時和顯示時間.這種方式同樣可以應用于跨過程的計時,只要有統一的Benchmark Handle, 就可以,實現的代碼如下

????typedef?LARGE_INTEGER?HBENCHMARK;

????
//////////////////////////////////////////////////////////////////////////
????//?Single?turn?timer?routine

????
//?begin
????void?Tic(HBENCHMARK&?node);
????
//?end,?display?timer.
????void?Toc(HBENCHMARK&?node,?std::string?prefix?=?"");

????
//////////////////////////////////////////////////////////////////////////
????//?Multiple?turns?timer?routine

????
//?initialize?timer
????void?Tik(HBENCHMARK&?node);
????
//?resume?timer
????void?Trk(HBENCHMARK&?node);
????
//?stop?timer
????void?Tsk(HBENCHMARK&?node);
????
//?end,?display?timer
????void?Tok(HBENCHMARK&?node,?std::string?prefix?=?"");

????
//-----------------------------------------------------------------------
????void?Tic(HBENCHMARK&?node)
????
{
????????QueryPerformanceCounter(
&node);
????}

????
//-----------------------------------------------------------------------
????void?Toc(HBENCHMARK&?node,?std::string?prefix)
????
{
????????
static?LARGE_INTEGER?endtime;
????????QueryPerformanceCounter(
&endtime);

????????node.QuadPart?
=?endtime.QuadPart?-?node.QuadPart;

????????
if(prefix.length()?>?0)
????????????ToolLib::LogManager::getSingleton().logMessage(prefix);
????????ToolLib::LogManager::getSingleton().logMessage(
"Benchmark:?"?+?
????????????TOSTR(node.HighPart)?
+?","?+?TOSTR(node.LowPart));
????}

????
//-----------------------------------------------------------------------
????void?Tik(HBENCHMARK&?node)
????
{
????????node.QuadPart?
=?0;
????}

????
//-----------------------------------------------------------------------
????void?Trk(HBENCHMARK&?node)
????
{
????????
static?LARGE_INTEGER?curTime;
????????QueryPerformanceCounter(
&curTime);
????????node.QuadPart?
=?curTime.QuadPart?-?node.QuadPart;
????}

????
//-----------------------------------------------------------------------
????void?Tsk(HBENCHMARK&?node)
????
{
????????
static?HBENCHMARK?endTime;
????????QueryPerformanceCounter(
&endTime);
????????node.QuadPart?
=?endTime.QuadPart?-?node.QuadPart;
????}

????
//-----------------------------------------------------------------------
????void?Tok(HBENCHMARK&?node,?std::string?prefix)
????
{
????????
if(prefix.length()?>?0)
????????????ToolLib::LogManager::getSingleton().logMessage(prefix);
????????ToolLib::LogManager::getSingleton().logMessage(
"Benchmark:?"?+?
????????????TOSTR(node.HighPart)?
+?","?+?TOSTR(node.LowPart));
????}


這里使用的是WindowsAPI QueryPerformanceCounter函數,為的是測得精確的時鐘周期數