在写与性能相关的应用程序时,经常需要测代码的运行时间,听说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函数,为的是测得精确的时钟周期数