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 _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 实现

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python+vue流浪动物公益科普宠物在线领养网站

使用动物在线领养网站的用户分管理员和用户两个角色的权限子模块。 开发语言:Python 框架:django/flask Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 系统所要实现的功…

AI 时代,知识工作者的生存指南

最近,大家可能已经见识过 AI 的威力了吧,以 ChatGPT 为代表的 人工智能(AI)展现出接近人一样的回答水准。 来自 Craft AI Assitant AI 就在那里,是房间里的大象,大家不能总装做对自己没有影响。要知道&…

[架构之路-199] - 可靠性需求与可靠性分析:鱼骨图、故障树分析法FTA、失效模式与影响DFMEA,找到影响故障的主要因素

目录 引言: 第1章 故障树分析法与鱼骨图的比较 1.1 相同点 1.2 区别点 第2章 鱼骨图 第3章 故障树 3.1 示意图 3.2 故障树解读 3.3 故障树常见符号 第4章 产品失效(Failure)模式分析DFMEA 引言: 目标系统/产品的可靠性和性能在客户需求阶段就…

脂溶性荧光染料Cy7标记羧酸Cy7-COOH/Carboxylic acids星戈瑞

CY7-COOH是一种含有羧基的化合物,它的分子式为C37H45ClN2O2,分子量519.12。其化学结构中包含有一个吲哚菁骨架,以及一个羧基(COOH)官能团。它的分子式为C37H45ClN2O2,分子量519.12。CY7-COOH是一种近红外荧…

requset页面的代码逻辑

1. 封装请求基地址 在src目录下 放上一个专门写请求相关的文件夹 然后在里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 并且根据接口文档 写请求 然后把这个请求封装成一个函数,这个函数里需要传入两个参数 这两个参数 都放在d…

SpringMVC第二阶段:@RequestMapping注解详解

RequestMapping注解详解 RequestMapping是给个方法配置一个访问地址。就比如web学习的Servlet程序,在web.xml中配置了访问地址之后,它们之间就有一个访问映射关系。 1、value属性 value 属性用于配置方法对应的访问地址. /*** RequestMapping 可以配…

自动操作魔法师4.9.0.0

产品下载 (won-soft.com) 如下图所示: 彻底远离枯燥乏味的工作 在日常办公中,开发票,更新客户资料,打印报表,录入数据等等工作是极为重要,但大部分时候这些工作是相当枯燥的。你不得得一遍又一遍的进行重复…

Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)

Cesium加载影像图层 一、ImageryLayer类常用属性常用方法 二、ImageryLayerCollection类常用属性常用方法 三、ImageryProvider类常用属性常用方法 四、ImageryProvider子类1. ArcGisMapServerImageryProvider加载ArcGIS地图服务 2. BingMapsImageryProvider加载BingMap地图服务…

Java websocket 使用

简介 WebSocket 是一种基于 TCP 协议的全双工通信协议,可以在浏览器和服务器之间建立实时、双向的数据通信。在 Java 中,我们可以使用 Java API for WebSocket(JSR 356)来实现 WebSocket。 WebSocket 的作用是在 Web 应用程序中…

springboot+jsp+javaweb学生信息管理系统 05hs

springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 (1)管理员模块:系统中的核心用户是管…

ChatGPT国内免费使用的方法有哪些?

目录 一、ChatGpt是什么? 二、ChatGPT国内免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、ChatGpt是什么? ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

【MySQL】浅谈事务

哈喽,大家好~我是你们的老朋友:保护小周ღ 谈起 “事务”,可能大家都会在心中出现一个大大的 ?,博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制…

详解二叉树

🌈目录 一、树形结构​ 🌳1.1 概念1.2 其他概念1.3 树的表示形式 二、二叉树✨2.1 概念2.2 两种特殊二叉树2.3 性质2.4 二叉树存储 三、二叉树的基本操作🙌3.1 前置说明3.2 二叉树的遍历3.3 二叉树的基本操作 四、二叉树的OJ✍️ 一、树形结构…

康耐视智能相机insight主从触发以及康耐视insight视觉系统之间数据特有交互方式

1、一个相机设置为主系统,指定自己的名称,下方可以指定发给从系统的数据,触发方式不要设置 成网络 2、另外一个相机触发方式设置成网络,然后下方指定主系统的名称 3、主系统每触发一次,就会带动从系统触发,同时指定的数据会发送到从系 统,从系统使用函数getstring获取…

爱奇艺2020校招Java方向笔试题(第一场)

1.计算下列程序的时间复杂度&#xff08;&#xff09; for (i1;i<n;i)for(j1;j<m;j){a1,a2,a3,a4};A.O(n) B.O(mn) C.O(m) D.O(1) 答案:B 2.求递归方程T(n)4T(n/2)n 的解 ( ) A.O(n) B.O(n^2) C.O(n^3) D.O(logn) 答案:B 用Mater公式计算 3.下列关于动态规划算法说法错…

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…

国货大佬“卡脖子”后王者风范不减?小米卷出光学拍摄“天花板”?| 手机行业社媒心智品牌榜出炉

Social Power 核心解读 1、智能手机“乍暖还寒”&#xff0c;龙头品牌仍稳占消费者心智 比拼屏幕、赶超系统、迭代形态、拓展概念&#xff1f;眼花缭乱过后&#xff0c;产品精益求精&#xff0c;建立稳固的消费者认知&#xff0c;才是“保鲜”关键。在最新发布的数说故事5月…

MyBatis Plus 拦截器实现数据权限控制

一、介绍 上篇文章介绍的MyBatis Plus 插件实际上就是用拦截器实现的&#xff0c;MyBatis Plus拦截器对MyBatis的拦截器进行了包装处理&#xff0c;操作起来更加方便 二、自定义拦截器 2.1、InnerInterceptor MyBatis Plus提供的InnerInterceptor接口提供了如下方法&#x…

基于AI技术的API开发工具,自动化和智能化快速高效开发API

一、开源项目简介 ApiCat 是一款基于 AI 技术的 API 开发工具&#xff0c;它旨在通过自动化和智能化的方式&#xff0c;帮助开发人员更快速、更高效地开发 API。ApiCat 支持 OpenAPI 和 Swagger 的数据文件导入和导出&#xff0c;并可以对用户输入的 API 需求进行分析和识别&a…

真题详解(补码转换)-软件设计(七十四)

真题详解(索引查询)-软件设计&#xff08;七十三)https://blog.csdn.net/ke1ying/article/details/130659024 Composite模式&#xff1a; 以树形结构来表示”整体-部分”的关系&#xff0c;使得单个和团体的使用都具有一致性。 对一个基本有序的数组进行排序&#xff0c;适合…