通常我们在测试程序效能的时候,都需要一些计时的操作,计时的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 );
}
输出的结果:

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万+

被折叠的 条评论
为什么被折叠?



