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

std::chrono笔记

文章目录

    • 1. radio
      • 原型
      • 作用
      • 示例
    • 2. duration
      • 原型:
      • 作用
      • 示例
    • 3. time_point
      • 原型
      • 作用
      • 示例
    • 4. clocks
      • system_clock
        • 示例
      • steady_clock
        • 示例
      • high_resolution_clock

先说感觉,这个库真恶心,刚接触感觉跟shi一样,特别是那个命名空间,太长了。
就像这样:
在这里插入图片描述

后来感觉设计还挺巧妙,才觉得看起来顺眼一些。

1. radio

原型

template <intmax_t N, intmax_t D = 1> class ratio;

作用

时间换算的比率 / 表示时间精度。
ratio是一个比率的模板(分子/分母)。第一个模板参数是分子,第二个模板参数是分母,也可以只提供第一个,这样分母默认是0。主要用来表示精度、

可以把它当成一个分数,仅有ratio我们是做不了什么的。

示例

	ratio<60, 1> minute;ratio<1, 1> second;ratio<1, 1000> millisecond;

当然,头文件有预定义的例子,可以参考:

  typedef ratio<1,       1000000000000000000> atto;typedef ratio<1,          1000000000000000> femto;typedef ratio<1,             1000000000000> pico;typedef ratio<1,                1000000000> nano;typedef ratio<1,                   1000000> micro;typedef ratio<1,                      1000> milli;typedef ratio<1,                       100> centi;typedef ratio<1,                        10> deci;typedef ratio<                       10, 1> deca;typedef ratio<                      100, 1> hecto;typedef ratio<                     1000, 1> kilo;typedef ratio<                  1000000, 1> mega;typedef ratio<               1000000000, 1> giga;typedef ratio<            1000000000000, 1> tera;typedef ratio<         1000000000000000, 1> peta;typedef ratio<      1000000000000000000, 1> exa;

2. duration

原型:

template <class Rep, class Period = ratio<1> > class duration;

构造函数(想快点理解话,主要看第4个):

(1)duration() = default;    //默认构造
(2)duration (const duration& dtn);        //(2)(3)拷贝构造
(3)template<class Rep2, class Period2>constexpr duration (const duration<Rep2,Period2>& dtn);
(4)template<class Rep2>      //传递一个某类型(int等)的数值,构造一个时间段   constexpr explicit duration (const Rep2& n);

作用

表示一段时间。
第一个模板参数Rep可以是int、float、double,第二个模板参数Period用来表示精度。Rep表示Period的数目。

duration模板中的方法count用来返回Period的数量,返回值是Rep类型。

不同类型的duration之间的转换用duration_cast<>,原型如下:

template <class ToDuration, class Rep, class Period>
constexpr ToDuration
duration_cast (const duration<Rep,Period>& dtn);

示例

#include <iostream>
#include <chrono>
#include <ctime>using namespace std;
using namespace chrono;int main (void)
{using seconds_type = duration<int, ratio<1, 1>>;using minutes_type = duration<int, ratio<60, 1>>;using hours_type = duration<int, ratio<3600, 1>>;using milliseconds_type = duration<int, ratio<1, 1000>>;seconds_type oneday_seconds (3600 * 24);hours_type oneday_hours (24);minutes_type oneday_minutes (60 * 24);milliseconds_type oneday_milliseconds (3600 * 24 * 1000);cout << "一天的秒数: " << oneday_seconds.count() << endl;cout << "一天的小时数: " << oneday_hours.count() << endl;cout << "一天的分钟数: " << oneday_minutes.count() << endl;cout << "一天的毫秒数: " << oneday_milliseconds.count() << endl;hours_type oneday_hours_from_milliseconds = duration_cast<hours_type> (oneday_milliseconds);hours_type oneday_hours_from_seconds = duration_cast<hours_type> (oneday_seconds);hours_type oneday_hours_from_miniues = duration_cast<hours_type> (oneday_minutes);cout << "转换后>>" << endl;cout << "一天的小时数:" << oneday_hours_from_milliseconds.count() << endl;cout << "一天的小时数:" << oneday_hours_from_seconds.count() << endl;cout << "一天的小时数:" << oneday_hours_from_miniues.count() << endl;cout << "一天的秒数:" << duration_cast<seconds_type> (oneday_milliseconds).count() << endl;cout << "一天的秒数:" << duration_cast<seconds_type> (oneday_minutes).count() << endl;cout << "一天的秒数:" << duration_cast<seconds_type> (oneday_hours).count() << endl;cout << "一天的毫秒数:" << duration_cast<milliseconds_type> (oneday_seconds).count() << endl;cout << "一天的毫秒数:" << duration_cast<milliseconds_type> (oneday_minutes).count() << endl;cout << "一天的毫秒数:" << duration_cast<milliseconds_type> (oneday_hours).count() << endl;
}

打印结果:

一天的秒数: 86400
一天的小时数: 24
一天的分钟数: 1440
一天的毫秒数: 86400000
转换后>>
一天的小时数:24
一天的小时数:24
一天的小时数:24
一天的秒数:86400
一天的秒数:86400
一天的秒数:86400
一天的毫秒数:86400000
一天的毫秒数:86400000
一天的毫秒数:86400000

也可以用头文件中预定义的:

    /// nanosecondsusing nanoseconds	= duration<_GLIBCXX_CHRONO_INT64_T, nano>;/// microsecondsusing microseconds	= duration<_GLIBCXX_CHRONO_INT64_T, micro>;/// millisecondsusing milliseconds	= duration<_GLIBCXX_CHRONO_INT64_T, milli>;/// secondsusing seconds	= duration<_GLIBCXX_CHRONO_INT64_T>;/// minutesusing minutes	= duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>>;/// hoursusing hours		= duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>>;......

3. time_point

原型

template <class Clock, class Duration = typename Clock::duration>class time_point;

另外看一下system_clock中内容:

    struct system_clock{typedef chrono::nanoseconds				duration;typedef duration::rep					rep;typedef duration::period					period;typedef chrono::time_point<system_clock, duration> 	time_point;...

标准库有三种钟:system_clocksteady_clockhigh_resolution_clock

可以看出system_clock::time_point默认用的钟是system_clockduration是纳秒级别的nanoseconds

同时,为了转换不同的time_point,还提供了time_point_cast

template <class ToDuration, class Clock, class Duration>
time_point<Clock,ToDuration>
time_point_cast (const time_point<Clock, Duration>& tp);

作用

表示时间点,一个time point必须有一个clock计时

示例

  1. 打印
	system_clock::time_point tp_epoch;time_point<system_clock, seconds> tp_seconds (seconds (1));time_point<//默认的time_point是纳米级:system_clock::time_point tp (tp_seconds);printf ("system_clock中,一秒对应%d个时钟周期\n",tp.time_since_epoch().count() );system_clock::time_pointtime_t time = system_clock::to_time_t (tp);printf ("tp的打印结果:%s", ctime (&time));

打印结果:

system_clock中,一秒对应1000000000个时钟周期
tp的打印结果:Thu Jan  1 08:00:01 1970
  1. 转换
	using days_type = duration<int, ratio<3600 * 24>>;time_point<system_clock, days_type> today= time_point_cast<days_type> (system_clock::now());printf ("从epoch到现在的天数: %d", today.time_since_epoch().count());

打印结果:

从epoch到现在的天数: 19415

到这里应该更能体会到,那个ratio<3600 * 24>,表示一个单位,int其实是单位的数量,整体看起来就是一段时间,只不过这段时间的精度是按天来算的,且数目是int类型。

4. clocks

system_clock

system_clock表示当前的系统时钟,系统中运行的所有进程使用now()得到的时间是一致的。
每一个clock类中都有确定的time_point, duration, Rep, Period类型。
操作有:

  • now()
    • 当前时间time_point
  • to_time_t()
    • time_point转换成time_t
  • from_time_t()
    • time_t转换成time_poin

示例

计算时间日期

#include <iostream>
#include <chrono>
#include <ctime>
#include <fmt/format.h>using namespace std;
using namespace chrono;int main (void)
{using days_type = duration<int, ratio<3600 * 24>>;days_type one_day (1);system_clock::time_point today = system_clock::now();system_clock::time_point tomorrow = today + one_day;time_t time = system_clock::to_time_t (today);printf ("今天是:%s", ctime (&time));time = system_clock::to_time_t (tomorrow);printf ("明天是:%s", ctime (&time));
}

steady_clock

steady_clock 为了表示稳定的时间间隔,后一次调用now()得到的时间总是比前一次的值大(这句话的意思其实是,如果中途修改了系统时间,也不影响now()的结果),每次tick都保证过了稳定的时间间隔。
操作有:

  • now()
    • 获取当前时钟

示例

典型的应用是给算法计时。

#include <iostream>
#include <chrono>
#include <ctime>
#include <fmt/format.h>using namespace std;
using namespace chrono;int main (void)
{steady_clock::time_point t1 = steady_clock::now();cout << "打印1000个 *" << endl;for (int i = 0; i < 1000; ++i)cout << "*";cout << endl;steady_clock::time_point t2 = steady_clock::now();duration<double> time = duration_cast<duration<double>> (t2 - t1);cout << "花费的秒数:" << time.count() << endl;
}
*************************************...
花费的秒数:9.3816e-05

high_resolution_clock

最后一个时钟,high_resolution_clock 顾名思义,这是系统可用的最高精度的时钟。实际上high_resolution_clock只不过是system_clock或者steady_clocktypedef
操作有:

  • now()
    • 获取当前时钟。

参考博客:

C++11 std::chrono库详解

c++11 chrono全面解析(最高可达纳秒级别的精度)

相关文章:

std::chrono笔记

文章目录1. radio原型作用示例2. duration原型&#xff1a;作用示例3. time_point原型作用示例4. clockssystem_clock示例steady_clock示例high_resolution_clock先说感觉&#xff0c;这个库真恶心&#xff0c;刚接触感觉跟shi一样&#xff0c;特别是那个命名空间&#xff0c;太…...

接收arp请求并发送回应的实例

本文简单介绍了arp协议,用一个实例查看收到的ARP请求,并对该请求发出ARP回应,实例有完整的源代码,使用C语言在Linux下实现,代码中有详细的注释。 1. ARP协议 ARP(Address Resolution Protocol),地址解析协议;在局域网上通过IP地址获取物理地址MAC的协议,该协议工作在数…...

【高性能计算】TVM使用TE手动优化矩阵乘法算法解析与代码解读

引言 注&#xff1a;本文主要介绍、解释TVM的矩阵优化思想、代码&#xff0c;需要配合代码注释一起阅读。 矩阵乘法是计算密集型运算。为了获得良好的 CPU 性能&#xff0c;有两个重要的优化措施&#xff1a; 提高内存访问的高速缓存命中率。复杂的数值计算和热点内存&#x…...

消息中间件的概念

中间件(middleware)是基础软件的一大类&#xff0c;属于可复用的软件范畴。中间件在操作系统软件&#xff0c;网络和数据库之上&#xff0c;应用软件之下&#xff0c;总的作用是为处于自己上层的应用软件提供运行于开发的环境&#xff0c;帮助用户灵活、高效的开发和集成复杂的…...

窃密恶意软件Raccoon最新样本Stealer v2分析

Raccoon 是一个恶意软件家族&#xff0c;2019 年来一直在地下犯罪论坛中以恶意软件即服务的身份进行售卖。2022 年 7 月&#xff0c;该恶意软件家族发布了 C 语言编写的新版本 Raccoon Stealer v2&#xff0c;打破了以往使用 C 开发的传统。 Raccoon 是一个信息窃密恶意软件&a…...

足球俱乐部管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;网站是一种主要的渠道。人们通过互联网快速、准确的发布信息、获取信息。而足球俱乐部是足球职业化、专业化的一个标志&#xff0c;是足球运动员以足球谋生时&#xff0c;所被聘用的机构&#xff0c;应运时代发展&#xff0c;规模、…...

2023上半年数学建模竞赛汇总(比赛时间、难易程度、含金量、竞赛官网)

1、美国大学生数学建模竞赛等级&#xff1a;国家级是否可跨校&#xff1a;否竞赛开始时间&#xff1a;2月17日~2月21日综合难度&#xff1a;⭐⭐⭐⭐ 竞赛含金量&#xff1a;⭐⭐⭐⭐⭐竞赛官网&#xff1a;https://www.comap.com/2、MathorCup高校数学建模挑战赛---大数据竞赛…...

【python学习笔记】:PHP7 Null合并运算符

在PHP7&#xff0c;一个新的功能&#xff0c;空合并运算符(??)已被引入。它被用来代替三元运算并与 isset()函数功能结合一起使用。如果它存在并且它不是空的&#xff0c;空合并运算符返回它的第一个操作数;否则返回第二个操作数。 示例 <?php// fetch the value of $_…...

数据结构与算法——3.时间复杂度分析1(概述)

前面我们已经介绍了&#xff0c;研究算法的最终目的是如何花费更少的时间&#xff0c;如何占用更少的内存去完成相同的需求&#xff0c;并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异&#xff0c;但我们并不能将时间占用和空间占用量化。因此&#xff0c;接下来…...

FPGA学习之日常工作复位电路

最近一个多月没有写博客了&#xff0c;然后最近工作中也遇到一个复位信号的问题。问题是这样的&#xff0c;关于外部复位信号&#xff0c;之前我们的处理方式都是通过PLL产生的Lock信号作为内部的复位信号。但是由于换到A54上面没有IP核&#xff0c;所以只有不用PLL&#xff0c…...

【洛谷 P1177】【模板】快速排序 题解(快速排序+指针)

【模板】快速排序 题目描述 利用快速排序算法将读入的 NNN 个数从小到大排序后输出。 快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料&#xff0c;掌握后独立完成。&#xff08;C 选手请不要试图使用 STL&#xff0c;虽然你可以…...

Pthon--自动化实用技巧篇--文件目录处理

为什么要讲这一篇&#xff0c;主要是因为这个在自动化测试框架或者脚本的编写的时候会用到&#xff0c;还是比较方便的。看上述两个函数。getcwd()、chdir()。使用 os.getcwd() 函数获得当前工作目录。使用 os.chdir()函数改变当前工作目录。所以在用chdir()函数的时候别忘记指…...

想招到实干派程序员?你需要这种面试法

技术招聘中最痛的点其实是不精准。技术面试官或CTO们常常会向我们吐槽&#xff1a; “我经常在想&#xff0c;能不能把我们项目中的代码打印出来&#xff0c;作为候选人的面试题的一部分&#xff1f;” “能不能把一个Bug带上环境&#xff0c;让候选人来试试怎么解决&#xf…...

cesium常见操作:鼠标点击获取对象

目录 一、viewer.scene.pick&#xff08;获取Cartesian2&#xff09; 二、 viewer.scene.pickPosition&#xff08;获取Cartesian3&#xff09; 三、viewer.scene.drillPick&#xff08;穿透拾取&#xff0c;获取所有对象&#xff09; 四、viewer.scene.globe.pick&#xf…...

【玩转c++】git的安装和使用以及可视化处理

本期主题&#xff1a;git的安装和使用&#xff08;windows环境&#xff09;博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题 小编的能力有限&#xff0c;出现错误希望大家不吝赐1.两个工具介绍第一个工具git&#xff0c;链接gitee或者github等代码托…...

第三阶段02-Mybatis框架

Mybatis框架 Mybatis框架是目前最流行的数据持久层框架, 使用Mybatis框架可以帮助程序员自动生成JDBC代码, 程序员只需要通过注解或xml配置文件提供需要执行的SQL语句,以及对象和表的映射关系, Mybatis框架会根据此映射关系和SQL自动生成出JDBC代码,从而提高开发效率 Mybatis框…...

基于超像素的多视觉特征图像分割算法研究

0.引言 背景&#xff1a; 经典聚类算法&#xff1a;Kmeans、FCM 现有问题&#xff1a; 1&#xff09;现有算法大都是基于单一的视觉特征而设计的&#xff0c;eg&#xff1a;基于颜色特征的分割。 2&#xff09;没有考虑像素周围的空间信息&#xff1b;分割结果&#xff1a;多噪…...

mysql的三大日志

摘自https://blog.csdn.net/chuige2013/article/details/123027580 一. 初步认识 binlog二进制日志 redolog undolog 二. binlog binlog记录写入行操作 作用 1&#xff09;、主从复制&#xff1a;在Master端开启binlog&#xff0c;然后将binlog发送到各个Slave端&#xff0c;S…...

API接口及社区电子商务化的解释

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…...

[蓝帽杯 2021]One Pointer PHP

知识点&#xff1a;php 数组整型溢出&#xff0c;open_basedir 绕过分析 利用数组整型溢出绕过&#xff0c;因为PHP 会对溢出的数字处理为 float 类型。 <?php include "user.php"; if($userunserialize($_COOKIE["data"])){$count[$user->count]…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...