C++: 计时器类的设计和实现

文章目录

    • 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 _WIN32LARGE_INTEGER freq;LARGE_INTEGER pc;QueryPerformanceFrequency(&freq);QueryPerformanceCounter(&pc);return pc.QuadPart * 1000.0 / freq.QuadPart;
#elsestruct 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 成员: 表示计时器当前是否在运行(计时)
  • mStartTimemStopTime: 计时器开始和结束的时间。存储结束时间的目的是,在计时器停止后,可能想用多种不同的单位来表示耗时
  • 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 msdouble getElapsedAsMillisecond(bool shouldStop=true);// microsecond: 1s=10^6 μs    1μs=10^(-3) msdouble 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 实现

留空,有心人可以按上面的内容自行实现。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部