一个用于分步计时的计时器

通常我们在测试程序效能的时候,都需要一些计时的操作,计时的API调用林林总总,我自己比较喜欢使用的是boost库里面的timer,方便实用。不过对于需要分步计时的状况(比如一个完整的处理过程要分成4步,我们希望得到每一步花费的时间和总共花费的时间),还需要写满多额外的代码,而一个优秀的程序员应该遵循DRY - Don't repeat yourself 的原则 ^_^,所以自己写了一个可用于分步计时的计时器。

PS:
string 和 vector 使用的都是QT库的实现,需要的话也可以换成标准库的实现。

KTimer.h
#pragma  once
#include 
< QString >
#include 
< QVector >

#include 
< boost / timer.hpp >
#include 
< utility >

namespace milk
{
    typedef std::pair
<QString, double>    STEP_RECOED;
    typedef QVector
<STEP_RECOED>        PROCEDURE_RECORD;

    
/** A step markable timer, can record each step's used time in a
        long process procedure. 
*/

    
class KTimer
    
{
    
private:
        QString                _name;
        boost::timer        _timer;
        PROCEDURE_RECORD    _record;
        
double                _total;

    
public:
        KTimer(
const QString& name) : _name(name), _total(0)
        
{
        }

        
/** Restart. */
        
void restart()
        
{
            _timer.restart();
            _record.clear();
            _total 
= 0;
        }


        
/** Mark current step and return itself. */
        KTimer
&    mark() {return mark(QString("S %1").arg(_record.size() + 1));}
        
/** Mark with a name. */
        KTimer
& mark(const QString&);
        
/** Total elapsed time. */
        
double total() {return _total;}
        
/** Last step's used time. */
        
double lastStep() {return _record.last().second;}
        
/** Return the record of the whole procedure. */
        PROCEDURE_RECORD record() 
const {return _record;}
        
/** Get String. */
       
QString toString() const;
    }
;
}



KTimer.cpp

#include  " KTimer.h "

namespace  milk
{
    KTimer
& KTimer::mark(const QString& name)
    
{
        _record.append(STEP_RECOED(name, _timer.elapsed() 
- _total));
        _total 
= _timer.elapsed();

        
return *this;
    }


    QString KTimer::toString() 
const
    
{
        QString result 
= QString("[%1][%2][T %3] - ")
            .arg(_name).arg(_record.size()).arg(_total, 
4'f'3);

        
foreach(STEP_RECOED record, _record)
        
{
            result 
+= QString(" %1, %2s;")
                .arg(record.first)
                .arg(record.second, 
4'f'3);
        }


        
return result;
    }

}


一段使用的例程:

void  CoreTest::testKTimer()
{
    milk::KTimer ktimer(
"KTimer Test");

    Sleep(
200);
    std::cout
<<qPrintable(ktimer.mark("First").toString())<<std::endl;

    Sleep(
300);
    std::cout
<<qPrintable(ktimer.mark("Second").toString())<<std::endl;

    Sleep(
100);
    std::cout
<<qPrintable(ktimer.mark("Third").toString())<<std::endl;

    Sleep(
500);
    std::cout
<<qPrintable(ktimer.mark("Last").toString())<<std::endl;

    CPPUNIT_ASSERT( 
true );
}

输出的结果:

一个用于分步计时的计时器_第1张图片

你可能感兴趣的:(timer,String,vector,Class,qt,pair)