当前位置: 首页 > news >正文

C++开发基础之简单的计时器也有适配场景

一、前言

计时器的开发通常涉及到计算时间间隔的方法和计算时间的方式。一般计时器的开发步骤:

  1. 获取起始时间点:在开始计时时,记录当前的时间戳作为起始时间点。

  2. 获取结束时间点:在结束计时时,记录当前的时间戳作为结束时间点。

  3. 计算时间间隔:通过起始时间点和结束时间点的差值,计算出经过的时间间隔。

  4. 显示计时结果:将计算得到的时间间隔转换成合适的时间单位(如毫秒、秒等),并展示给用户。

二、计时器的适配场景

下面是对比各种方法实现计时器功能的优劣势、适用场景、精度、易用性和平台兼容性的表格:

方法优势劣势适用场景精度易用性平台兼容性
<chrono>高精度、跨平台需要 C++11 及以上标准支持跨平台应用、需要高精度计时的场景良好
标准库函数简单易用精度可能不够高简单计时需求、不需要太高精度的场景低 - 中良好
系统特定函数高精度、系统调用简单可移植性差特定平台上需要更高精度的计时需求
第三方库功能丰富、可扩展性强引入外部依赖复杂计时需求、需要定制化计时功能的场景良好
硬件计时器高精度、硬件支持硬件依赖性强对计时精度要求极高的场景非常高依赖硬件

三、基于标准库实现

3.1 使用clock函数

使用 clock() 函数实现计时器功能。

  1. 记录开始时间:在需要开始计时的地方调用 clock() 函数,将其返回值保存为开始时间。
  2. 记录结束时间:在需要结束计时的地方再次调用 clock() 函数,将其返回值保存为结束时间。
  3. 计算时间间隔:将结束时间减去开始时间,然后除以 CLOCKS_PER_SEC 来获取经过的时间(以秒为单位)。
#include <iostream>
#include <ctime>int main() {clock_t start, end;double cpu_time_used;start = clock(); // 记录开始时间// 进行需要计时的操作for (int i = 0; i < 1000000; ++i) {// do something}end = clock(); // 记录结束时间cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; // 计算时间间隔std::cout << "CPU time used: " << cpu_time_used << " seconds" << std::endl;return 0;
}

在这个示例中,首先记录了开始时间和结束时间,然后计算了经过的时间间隔。
请注意,由于 clock() 函数返回的是 CPU 时钟周期数,所以需要将其转换为秒数才能得到实际的时间间隔。

3.2 使用time函数

使用 time() 函数实现计时器相对简单,但其精度可能不足以满足高精度计时的需求。

#include <iostream>
#include <ctime>int main() {time_t start, end;double time_used;start = time(NULL); // 记录开始时间// 进行需要计时的操作for (int i = 0; i < 1000000; ++i) {// do something}end = time(NULL); // 记录结束时间time_used = difftime(end, start); // 计算时间间隔std::cout << "Time used: " << time_used << " seconds" << std::endl;return 0;
}

在这个示例中,我们使用 time() 函数获取当前时间的秒数作为开始时间和结束时间,并通过 difftime() 函数计算时间间隔。
请注意,time() 函数返回的时间精度通常是秒级别,因此不适合需要高精度计时的场景。如果需要更高精度的计时功能,建议使用其他方法,如 <chrono> 头文件中的函数。

四、基于chrono库实现

使用<chrono>头文件中的功能来实现计时功能:

#include <iostream>
#include <chrono>class Timer {
public:void start() {startTime = std::chrono::high_resolution_clock::now();}void stop() {endTime = std::chrono::high_resolution_clock::now();}void displayDuration(const std::string& message) {auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime);std::cout << message << ": " << duration.count() << " ms" << std::endl;}
private:std::chrono::time_point<std::chrono::high_resolution_clock> startTime, endTime;
};
int main() {Timer timer;timer.start();// 模拟一些操作for (int i = 0; i < 1000000; ++i) {// do something}timer.stop();timer.displayDuration("Elapsed time");return 0;
}

在这个示例中,Timer类封装了计时器的功能。start()方法开始计时,stop()方法停止计时,displayDuration()方法用于显示经过的时间。
main()函数中,创建一个Timer对象,调用start()开始计时,在模拟的操作后调用stop()停止计时,并调用displayDuration()方法显示经过的时间。

五、基于系统特定函数

5.1 QueryPerformanceCounter

可以使用Windows系统提供的QueryPerformanceCounter()函数来实现简单计时器功能:

#include <iostream>
#include <Windows.h>class Timer {
public:void start() {QueryPerformanceFrequency(&frequency);QueryPerformanceCounter(&startCounter);}void stop() {QueryPerformanceCounter(&endCounter);}void displayDuration(const std::string& message) {LARGE_INTEGER elapsedTime;elapsedTime.QuadPart = endCounter.QuadPart - startCounter.QuadPart;double duration = static_cast<double>(elapsedTime.QuadPart) / frequency.QuadPart;std::cout << message << ": " << duration << " seconds" << std::endl;}private:LARGE_INTEGER frequency;LARGE_INTEGER startCounter, endCounter;
};int main() {Timer timer;timer.start();// 模拟一些操作for (int i = 0; i < 1000000; ++i) {// do something}timer.stop();timer.displayDuration("Elapsed time");return 0;
}

在这个示例中,Timer类使用QueryPerformanceCounter()函数来获取高精度的计时。start()方法开始计时,stop()方法停止计时,displayDuration()方法用于显示经过的时间。
main()函数中,创建一个Timer对象,调用start()开始计时,在模拟的操作后调用stop()停止计时,并调用displayDuration()方法显示经过的时间。

5.2 GetTickCount64

GetTickCount64函数是Windows API中用于获取系统启动后经过的毫秒数的函数,它可以用来实现简单的计时器功能。

#include <iostream>
#include <Windows.h>class Timer {
public:void start() {startTime = GetTickCount64();}void stop() {endTime = GetTickCount64();}void displayDuration(const std::string& message) {DWORD duration = endTime - startTime;std::cout << message << ": " << duration << " ms" << std::endl;}private:ULONGLONG startTime, endTime;
};int main() {Timer timer;timer.start();// 模拟一些操作for (int i = 0; i < 1000000; ++i) {// do something}timer.stop();timer.displayDuration("Elapsed time");return 0;
}

在这个示例中,Timer类使用GetTickCount64函数来获取系统启动后的毫秒数。start()方法开始计时,stop()方法停止计时,displayDuration()方法用于显示经过的时间。

main()函数中,创建一个Timer对象,调用start()开始计时,在模拟的操作后调用stop()停止计时,并调用displayDuration()方法显示经过的时间。

六、基于第三方库实现

使用C++中的高精度计时器库ChronoLib来实现计时器功能:

#include <iostream>
#include "ChronoLib.h"int main() {Chrono::high_resolution_timer timer;double elapsed_time = 0.0;// 计时开始timer.start();// 执行需要计时的操作// ...// 计时结束elapsed_time = timer.elapsed();// 输出计时结果std::cout << "Elapsed Time: " << elapsed_time << " seconds" << std::endl;return 0;
}

在这个示例中,我们使用ChronoLib库中的high_resolution_timer类来实现高精度计时器功能。我们创建了一个计时器对象timer和一个变量elapsed_time来保存计时结果。在需要计时的操作执行前,我们通过start函数开始计时。在需要计时的操作执行完成后,我们使用elapsed函数来获取计时结果,并将结果保存到elapsed_time变量中。最后,我们输出计时结果。

七、基于硬件计时器模块实现

硬件计时器通常指的是计算机或嵌入式系统中的专用计时器硬件模块,这些模块通常由硬件设计师设计并集成到处理器或主板中。硬件计时器具有高精度、稳定性和可靠性的特点,通常用于需要精确时间测量和控制的应用场景。

八、总结

每种方法都有其独特的优势和劣势,具体选择取决于项目需求、平台要求和精度要求。

相关文章:

C++开发基础之简单的计时器也有适配场景

一、前言 计时器的开发通常涉及到计算时间间隔的方法和计算时间的方式。一般计时器的开发步骤&#xff1a; 获取起始时间点&#xff1a;在开始计时时&#xff0c;记录当前的时间戳作为起始时间点。 获取结束时间点&#xff1a;在结束计时时&#xff0c;记录当前的时间戳作为结…...

数电学习笔记——逻辑函数及其描述方法

目录 一、逻辑函数 二、逻辑函数的描述方法 1、逻辑真值表 2、逻辑函数式 3、逻辑图 4、波形图 三、逻辑函数的两种标准形式 1、最小项与最大项 最小项 最小项的性质 最大项 最大项的性质 2、最大项与最小项的关系 3、逻辑函数的最小项之和形式 4、逻辑函数的最…...

2024年护眼台灯哪家品牌好?五款优质品牌专业推荐

护眼台灯几乎是每个孩子书桌上都会有的灯具&#xff0c;但还是有不少家长觉得是“智商税”。其实护眼台灯好处非常多&#xff0c;列如能够提供舒适的照明&#xff0c;缓解用眼疲劳&#xff0c;预防近视等等。所以今天准备了一期护眼台灯测评&#xff0c;并附上护眼台灯的榜单&a…...

搜索iconfont或者阿里图标就可以得到免费的图标

你在搜索过程中就会出现一些无耻&#xff0c;不要脸的网站&#xff0c;比如说下面这个 这个才是阿里图标 看它的网址 都是免费的...

android实战视频教程,细数Android开发者的艰辛历程

缘起 随着互联网企业的不断发展&#xff0c;产品项目中的模块越来越多&#xff0c;用户体验要求也越来越高&#xff0c;想实现小步快跑、快速迭代的目的越来越难&#xff0c;还有应用之间的互相调用等等问题&#xff0c;插件化技术应用而生。如果没有插件化技术&#xff0c;美…...

nav2_gps_waypoint_follower_demo 不能在ros2 humble中直接使用的解决方法

GIT上的nav2_gps_waypoint_follower_demo是基于ros-iron编写的&#xff0c;其中followGpsWaypoints(wps) service只能在Iron上使用。 解决方法&#xff1a; 第一步&#xff1a;将interactive_waypoint_follower.py修改为如下代码&#xff1a; import rclpy from rclpy.node …...

华为OD机试 - 螺旋数字矩阵

1 题目描述 疫情期间&#xff0c;小明隔离在家&#xff0c;百无聊赖&#xff0c;在纸上写数字玩。他发明了一种写法&#xff1a; 给出数字个数 n &#xff08;0 < n ≤ 999&#xff09;和行数 m&#xff08;0 < m ≤ 999&#xff09;&#xff0c;从左上角的 1 开始&…...

Vue响应式内容丢失处理

对数组和对象进行不当的修改会使Vue的对象丢失响应式&#xff0c;这时可以直接console.log丢失的对象&#xff0c;看是否有getter和setter 对于数组和对象&#xff0c;只有使用 Vue 提供的一些方法&#xff08;如 push()、pop()、splice()、set() 等&#xff09;进行修改才会触…...

Linux安装Rabbitmq

说明&#xff1a;本文章主要是rabbitmq在Linux系统上的安装&#xff0c;文章中包含了rabbitmq的下载及依赖下载 1.版本选取&#xff0c;这里的选取主要是版本的兼容问题 去这个网址查看mq和erlang版本兼容&#xff1a;RabbitMQ Erlang Version Requirements | RabbitMQ 2.相…...

在nginx 服务器部署vue项目

以人人快速开发的开源项目&#xff1a;renren-fast-vue 为例 注&#xff1a;这里开始认为各位都会使用nginx 打包vue项目 npm run build 测试打包的项目是否可以运行 serve dist 可以正常运行 编译报错请移步到&#xff1a;renren-fast-vue1.2.2 项目编译报错: build g…...

制作一个简单的HTML个人网页

制作一个简单的HTML个人网页 1.1 硬件1.1.1 一台电脑1.1.2 配置要求 1.2 系统1.3 软件 二、制作一个简单的HTML个人网页1.创建一个HTML网页1.1 新建文本文档1.2 另存文本文档1.3 命名为index.html 2.编写HTML代码2.1 打开HTML2.2 复制HTML代码2.3 粘贴HTML代码2.4 保存HTML 3.预…...

HM2019创建载荷工况

该案例中将介绍载荷、工况、约束的创建 步骤一&#xff1a;首先创建两个载荷集(Load Collector)用来存放载荷和约束 步骤二&#xff1a;在Analysis面板下创建约束(Analysis→constraints) 注意&#xff1a;Load type选择SPC表示统计过程控制(Statistical Process Control) 步…...

Effective C++ 学习笔记 条款14 在资源管理类中小心copying行为

条款13导入这样的观念&#xff1a;“资源取得时机便是初始化时机”&#xff08;Resource Acquisition Is Initialization&#xff0c;RAII&#xff09;&#xff0c;并以此作为“资源管理类”的脊柱&#xff0c;也描述了auto_ptr和tr1::shared_ptr如何将这个观念表现在heap-base…...

c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题

1、单链表逆序 思路图 代码实现 //著: 链表结构里记得加 friend void ReverseLink(Clink& link); void ReverseLink(Clink& link) {Node* p link.head_->next_;while( p nullptr){return;}Node* q p->next_;link.head_->next_ nullptr;while(p ! nullpt…...

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题&#xff0c;就是在挂起虚拟机的时候&#xff0c;虚拟机提示我XX脚本正在运行&#xff0c;很奇怪&#xff0c;我没有运行脚本&#xff0c;为什么会提示我这个呢。今天恢复虚拟机&#xff0c;也提示了一下脚本的问题&#xff0c;而且发现Linux明显异…...

DolphinScheduler——奇富科技的调度实践

目录 一、技术架构 二、业务挑战 2.1 调度任务量大 2.2 运维复杂 2.3 SLA要求高 三、调度优化实践 3.1 重复调度 3.2 漏调度 3.3 Worker服务卡死 3.4 任务重复运行 四、服务监控 4.1 方法耗时监控 4.2 任务调度链路监控 五、用户收益 原文大佬的这篇调度系统案例…...

2024年最全洗地机选购攻略盘点丨希亦、小米、云鲸、海尔洗地机哪款值得入手?

在现代家居清洁中&#xff0c;洗地机是不可或缺的得力助手&#xff0c;它融合了吸尘、拖地等多种功能。面对市场上琳琅满目的洗地机品牌和型号&#xff0c;选择一个可靠的品牌至关重要。优质的品牌能够提供高品质的产品&#xff0c;使您的清洁工作更加轻松高效。本文将向您推荐…...

HTML笔记3

21&#xff0c;label标签 <label for"...">...</label> <label>...</label> <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content&qu…...

利用Python副业赚钱,看完这篇你就懂了!

Python都可以做哪些副业&#xff1f; 1、兼职处理数据Excel整理数据功能虽然很强大&#xff0c;但在Python面前&#xff0c;曾经统治职场的它也的败下阵来。因为Python在搜集数据整理分析数据的过程中更加便捷&#xff0c;通过几行代码还可以实现自动化操作。 如果你学会Pyth…...

FP16(半精度浮点数)、FP32(单精度浮点数)和INT8

在深度学习和计算机视觉领域中&#xff0c;FP16&#xff08;半精度浮点数&#xff09;、FP32&#xff08;单精度浮点数&#xff09;和INT8&#xff08;8 位整数&#xff09;是常见的数据类型或精度表示方式。它们在不同的场景下有各自的优势和用途。 FP16&#xff08;半精度浮…...

为内部工具集成大模型能力时如何选择与接入 Taotoken

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为内部工具集成大模型能力时如何选择与接入 Taotoken 在企业内部开发数据分析、客服助手、代码生成等工具时&#xff0c;引入大模型…...

2026年初中生赴新加坡留学,费用究竟几何?一文为你揭秘!

在教育全球化的今天&#xff0c;越来越多的家长将目光投向海外&#xff0c;新加坡凭借其优质的教育资源、安全的社会环境和多元的文化氛围&#xff0c;成为众多初中生留学的热门选择。那么&#xff0c;2026年初中生赴新加坡留学的费用到底是多少呢&#xff1f;本文将为你详细揭…...

抖音无水印视频下载技术深度解析:双架构设计与性能优化方案

抖音无水印视频下载技术深度解析&#xff1a;双架构设计与性能优化方案 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载&#xff1a;https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downloader 抖音无…...

暗黑破坏神2存档编辑器终极指南:5步轻松掌握角色定制与物品管理

暗黑破坏神2存档编辑器终极指南&#xff1a;5步轻松掌握角色定制与物品管理 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾因暗黑破坏神2中稀有的装备掉落率而烦恼&#xff1f;是否想重新调整角色属性却不想从头开始&a…...

3ds Max离线帮助文档还能这么用?打造你的个人3D知识库(含效率翻倍技巧)

3ds Max离线帮助文档的进阶玩法&#xff1a;构建你的私有3D知识引擎 当大多数3D艺术家还在依赖零散的在线教程和碎片化笔记时&#xff0c;一小部分资深用户已经将3ds Max离线帮助文档改造成了私人定制的专业知识库。这不仅仅是一个本地化的文档集合&#xff0c;而是一个可以深度…...

UML类图实战:从设计到代码的精准映射

1. 为什么需要从UML类图到代码的精准映射&#xff1f; 第一次接触UML类图时&#xff0c;我总觉得它像是一张"纸上谈兵"的设计稿。直到在实际项目中踩过几次坑才明白&#xff0c;类图与代码之间的精准映射能力&#xff0c;是区分普通程序员和架构师的关键技能之一。 …...

2026年主流行工具有何不同?subAgent是趋势还是营销?深度解析!

AI Coding工具中的“subAgent”正从营销词发展为工程抽象&#xff0c;实现上下文、权限、任务和执行的拆分管理。主流工具如Claude Code、Codex、OpenClaw、Gemini CLI均在强化subAgent能力&#xff0c;但设计哲学各异。文章从技术视角解析subAgent的本质、各工具异同及使用选择…...

避坑指南:在CentOS 7上部署泛微Ecology9 OA,我踩过的那些“内存不足”和“防火墙”的坑

CentOS 7部署泛微Ecology9 OA系统&#xff1a;从内存优化到防火墙配置的深度避坑指南 在Linux环境下部署企业级OA系统从来都不是一件简单的事情&#xff0c;尤其是像泛微Ecology9这样功能复杂的大型系统。表面上看&#xff0c;官方文档和网络上的教程似乎已经提供了完整的步骤&…...

Vivado/DC中set_max_delay的另类用法:搞定异步FIFO等CDC路径的“半时序检查”

Vivado/DC中set_max_delay的工程艺术&#xff1a;异步FIFO时序约束的第三种策略 在数字电路设计中&#xff0c;异步时钟域&#xff08;CDC&#xff09;路径的处理一直是工程师们面临的棘手问题。传统做法往往陷入非黑即白的极端——要么完全忽略时序检查&#xff08;set_false_…...

如何快速提高能力

人机协作&#xff0c;AI模型&#xff1a;Deepseek仅供参考如何快速提高能力在快节奏的现代社会中&#xff0c;每个人都渴望快速提升自己的能力&#xff0c;无论是职场竞争力、专业技能&#xff0c;还是通用素养。能力的提升并非一蹴而就&#xff0c;但遵循科学有效的方法&#…...