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


在这里插入图片描述

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 成员: 表示计时器当前是否在运行(计时)
  • 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 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 实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值