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

news2024/11/29 20:40:20

文章目录

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ATT-ACK靶场渗透(一)

开启内网环境 kali攻击机ip为 192.168.88.156 主机发现、端口扫描 进行主机发现 nmap -sS 192.168.88.156/24 -Pn 192.168.88.1和192.168.88.2可能为网关之类的,不管 weblogic漏洞利用 192.168.88.182开放了80端口和7001(weblogic)端口…

超越预期:ConvNeXt技术催生YOLOv5目标检测巨变 ,实现超准确率

目录 引言一、ConvNeXt的介绍1、目标检测的重要性2、YOLOv5的介绍3、ConvNeXt原理和特点4、ConvNeXt结构 二、相关研究综述1、目标检测的基础原理和流程2、YOLOv5的特点与局限性3、ConvNeXt技术在目标检测中的应用现状 三、ConvNeXt在YOLOv5中的应用与改进1、安装PyTorch和torc…

阿里Java工程规约(来源阿里)

一、应用分层 1.开放接口层: 可直接封装 Service 接口暴露成 RPC 接口;通过 Web 封装成 http 接口;网关控制层等。 2.终端显示层: 各个端的模板渲染并执行显示层。当前主要是 velocity 渲染,JS 渲染,JSP 渲…

[golang gin框架] 33.Gin 商城项目- 微信支付操作相关功能讲解

一.微信支付准备工作 准备工作 申请条件: 个体工商户 、企业、政府及事业单位 PC网站接入支付官网,其他(app,小程序,公众号等)可参考 PC网站接入支付 需要获取内容 appid:应用 APPID(必须配置,开户邮件中可查看) MCHID&#xff1a…

Java Socket和ServerSocket 使用

在Java中,Socket和ServerSocket是用于创建网络连接的重要类。Socket类用于创建客户端套接字,而ServerSocket类用于创建服务器套接字。在本文中,我们将讨论Socket和ServerSocket的作用、使用方法以及相关代码示例。 Socket的作用 Socket是Jav…

【连续介质力学】张量的并矢和性质1

张量的代数操作 并矢 Dyadic 两个向量的张量积是一个并矢,得到一个二阶张量 u ⃗ v ⃗ u ⃗ ⨂ v ⃗ A \vec u \vec v \vec u \bigotimes \vec v A u v u ⨂v A 其中, ⨂ \bigotimes ⨂是张量乘积,任意张量可以表示成并矢的线性组合 …

戴尔 Dell XPS 13 7390电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件型号驱动情况 主板戴尔 Dell XPS 13 7390 处理器Intel Core i7-10510u已驱动 内存 16 GB ( 酷兽 DDR4 3200MHz 8GB x 2 )已驱动 硬盘三星 SSD 860 EVO 250GB (250 …

【iOS】--KVC与KVO

键值编码(KVC)与键值监听(KVO) KVC(Key Value Coding)允许以字符串的形式间接操作对象的属性。 简单的KVC 最基本的KVC由NSKeyValueCoding协议提供支持,最基本的操作属性的两个方法如下 set…

利用具有局部信息的引导自注意进行息肉分割

文章目录 Using Guided Self-Attention with Local Information for Polyp Segmentation摘要本文方法PP-Guided Self-AttentionLocal-to-Global Mechanism损失函数 实验结果 Using Guided Self-Attention with Local Information for Polyp Segmentation 摘要 背景 自动准确的…

Microsoft Edge是一款现代化的浏览器,它拥有众多功能和强大的性能

随着互联网的不断发展,浏览器已经成为我们日常生活中必不可少的工具之一。作为一款现代化的浏览器,Microsoft Edge拥有许多强大的功能,为用户带来更加流畅的浏览体验。最近,Edge推出了分屏功能,这项功能可以大大提高生…

STM32------ADC

ADC 1、ADC介绍 1、1介绍 ADC即模数转换器。 例如:电信号转化成数字量。 1、2 ADC类型 并联比较型、逐次逼近型 并联比较型如下: 分压部分比较部分编码部分。 ADC分辨率:三位(上图) 优点:转换速度快…

类和对象下

文章目录 一、初始化列表1、语法:2、初始化顺序 二、static成员三、友元1、友元函数2、友元类 四、拷贝对象时的编译器优化例1、例2、例3、 一、初始化列表 1、语法: 初始化列表: 以一个冒号开始,接着是一个以逗号分隔的数据成员…

【Python PyTorch】零基础也能轻松掌握的学习路线与参考资料

文章目录 一、PyTorch的基础知识二、PyTorch数据处理三、PyTorch模型构建四、PyTorch模型训练和评估五、总结 作为当前最流行的深度学习框架之一,PyTorch已成为许多数据科学家和深度学习工程师的首选。本文将提供一条针对初学者的完整的学习路线,包括PyT…

hnust 湖南科技大学 2023 安卓 期中考试 复习资料

前言 ★:录音中提到的致谢:hwl,lqx,ly,sw重点来源:7-8班 PPT和录音内容来源:PPT知识点大多很抽象,需要联系实际代码来理解多做1-9章课后习题,编程题可以不做获取最新版本…

【AI大模型】“讯飞星火”大模型计划10月底赶超ChatGPT

文章目录 前言你使用过这种对话式AI吗?有什么看法或感受?“讯飞星火大模型将超越chatgpt?”这类型的人工智能对现在的社会有什么意义?这类型的人工智能,未来前景如何?申请体验写在最后 前言 5月6日&#xf…

第十三章 使用Postfix与Dovecot部署邮件系统

文章目录 第十三章 使用Postfix与Dovecot部署邮件系统一、电子邮件系统1、常见的邮件协议2、注意事项 二、部署电子邮件系统1、部署基础的电子邮件系统(1)、配置服务器主机名称(2)、配置服务器的DNS地址(3)…

【LeetCode: 115. 不同的子序列 | 暴力递归=>记忆化搜索=>动态规划 | 位置对应】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

队列Queue和栈Stack

什么是队列queue? 先进先出表,是一种受限制的线性表.其限制是仅允许在表的队尾进行插入数据和表的队头进行删除数据. 队列的使用场景: 线程池ThreadPoolExecutor ThreadPoolExecutor源码中核心变量(前面3个是重点) corePoolSize线程池维护的最小线程数量,哪怕是空闲的BlockQ…

Carla仿真三:Traffic Manager交通管理器详解

CARLA Traffic Manager 一、什么是Traffic Manager1、Traffic Manager简介2、Traffic Manager框架3、Traffic Manager模块 二、Traffic Manager控制方法1、TM控制交通参与者的自动驾驶的规则2、TM控制交通参与者行为的API摘要3、TM控制交通参与者行为的API 三、Traffic Manager…

力扣sql中等篇练习(十九)

力扣sql中等篇练习(十九) 1 苹果和桔子的个数 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 没有使用group by也可以使用sum函数,因为默认是所有数据行自成一组 SELECT SUM(b.apple_countIFNULL(c.…