文章目录
- 1. 目的
- 2. 功能列表
- 3. 基础功能:获取耗时
- 4. API 设计: Timer 类
- 5. 单元测试
- 6. API 实现
1. 目的
使用 C++ Class 的形式,封装原本 C语言的获取时间的函数,提供更容易使用的计时器调用。
使用 C++03,原因是和先前的线程安全队列 Queue 搭配使用, 不使用 C++11 的 chrono 那一套可能有精度损失,不过这里的重点在于怎样分装,如果换 C++11 的 chrono 系列也是很方便的。
2. 功能列表
- 定义计时器, 可以立即开始计时,也可以不立即开启、等会儿再计时
- 可以手动开启计时
- 获取当前耗费的时间,单位可以是秒、毫秒、微秒
- 获取当前耗时时,可以选择让计时器停下来,也可以不停止
- 兼顾 Unix(Linux+MacOSX+Android) 和 Windows
3. 基础功能:获取耗时
/// Return time in milliseconds (10^(-3) seconds)
static inline double getCurrentTime()
{
#ifdef _WIN32
LARGE_INTEGER freq;
LARGE_INTEGER pc;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&pc);
return pc.QuadPart * 1000.0 / freq.QuadPart;
#else
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_sec * 1000.0 + ts.tv_nsec / 1000000.0;
#endif // _WIN32
}
static double getElapsedTime(const double startTime)
{
return getCurrentTime() - startTime;
}
4. API 设计: Timer 类
这里给出 Timer 类的定义, 成员函数的实现留空, 重点关注的是函数功能
mRunning
成员: 表示计时器当前是否在运行(计时)mStartTime
和mStopTime
: 计时器开始和结束的时间。存储结束时间的目的是,在计时器停止后,可能想用多种不同的单位来表示耗时start()
函数:启动计时器stop()
函数:停止计时器getElapsedAsSecond()
: 以秒为单位,获取消逝的时间。它有一个默认参数bool shouldStop=true
, 表示是否需要在获取消逝的时间时,停止计时getElapsedAsMillisecond()
获取消逝的时间,单位为毫秒getElapsedAsMicrosecond()
获取消逝的时间,单位为微秒
class Timer
{
public:
explicit Timer(bool startNow=true) :
mStartTime(0),
mStopTime(0),
mRunning(false)
{}
void start();
void stop();
double getElapsedAsSecond(bool shouldStop=true);
// millisecond: 1s=1000 ms
double getElapsedAsMillisecond(bool shouldStop=true);
// microsecond: 1s=10^6 μs 1μs=10^(-3) ms
double getElapsedAsMicrosecond(bool shouldStop=true);
private:
double mStartTime;
double mStopTime;
bool mRunning;
};
5. 单元测试
TEST(Timer, EqualedElapsedTimeInVariousUnits)
{
Timer timer;
sleep(2);
double second = timer.getElapsedAsSecond();
EXPECT_NEAR(second, 2.0, 1e-3);
double millisecond = timer.getElapsedAsMillisecond();
double microsecond = timer.getElapsedAsMicrosecond();
EXPECT_NEAR(second, millisecond * (1e-3), 1e-3);
EXPECT_NEAR(millisecond, microsecond * (1e-3), 1e-3);
}
6. API 实现
留空,有心人可以按上面的内容自行实现。