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