在寫與性能相關的應用程序時,經常需要測代碼的運行時間,聽說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函數,為的是測得精確的時鐘周期數