在寫(xiě)與性能相關(guān)的應(yīng)用程序時(shí),經(jīng)常需要測(cè)代碼的運(yùn)行時(shí)間,聽(tīng)說(shuō)Intel Compiler下面用VTune可以做得很好,可惜不會(huì)用,受Matlab下的Tic,Toc語(yǔ)句的啟發(fā),寫(xiě)了一些類似的函數(shù),希望可以實(shí)現(xiàn)這樣的功能

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

如果要測(cè)的代碼是一個(gè)循環(huán)體的一部分,又希望測(cè)得總時(shí)間,像下面這樣

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

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

這里的Trk表示恢復(fù)計(jì)時(shí),Tsk表示暫停計(jì)時(shí),Tok里面包括了停止計(jì)時(shí)和顯示時(shí)間.這種方式同樣可以應(yīng)用于跨過(guò)程的計(jì)時(shí),只要有統(tǒng)一的Benchmark Handle, 就可以,實(shí)現(xiàn)的代碼如下

????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函數(shù),為的是測(cè)得精確的時(shí)鐘周期數(shù)