在寫(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ù)