std::chrono笔记

news/2024/4/25 6:54:30/文章来源:https://blog.csdn.net/qq_51470638/article/details/129249003

文章目录

    • 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全面解析(最高可达纳秒级别的精度)

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

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

相关文章

vue2 diff算法

diff是什么 diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点&#xff1a; ♥比较只会在同层级进行, 不会跨层级比较 ♥在diff比较的过程中&#xff0c;循环从两边向中间比较 diff 算法的在很多场景下都有应用&#xff0c;在 vue 中&#xff0c;作用于虚拟 dom…

预备2-CMD常用命令

CMD常用命令 先学简单常用的, 其余的要用在学 打开Cmd窗口 Win键R> 输入Cmd回车鼠标点击开始 > 附件>Cmd打开一个窗口,在地址栏输入cmd 操作目录 1.dir 查询当前目录有哪些文件 2.cd.. 上一级目录 3.cd e: 切换到E盘 4.d: 直接去d盘 5.cd /d e:abc 直接去E盘的abc目…

2023年房地产行业研究报告

第一章 行业发展概况 房地产业是指以土地和建筑物为经营对象&#xff0c;从事房地产开发、建设、经营、管理以及维修、装饰和服务的集多种经济活动为一体的综合性产业&#xff0c;是具有先导性、基础性、带动性和风险性的产业。主要包括&#xff1a;土地开发&#xff0c;房屋的…

解决AAC音频编码时间戳的计算问题

1.主题音频是流式数据&#xff0c;并不像视频一样有P帧和B帧的概念。就像砌墙一样&#xff0c;咔咔往上摞就行了。一般来说&#xff0c;AAC编码中生成文件这一步&#xff0c;如果使用的是OutputStream流写入文件的话&#xff0c;就完全不需要计算时间。但在音视频同步或者使用A…

debian 部署nginx https

我是flask 处理请求单进程&#xff0c; 差点意思 &#xff0c; 考虑先flask 在往下走 一&#xff1a;安装nginx 因为我是debian 系统&#xff0c;所以我的建议是直接 sudo apt-get install nginx 你也可以选择在官网下载&#xff0c; 但是我搭建ssl 的时候安装openssl非常的麻…

【无标题】(2019)NOC编程猫创新编程复赛小学组真题含参考

&#xff08;2019&#xff09;NOC编程猫创新编程复赛小学组最后6道大题。前10道是选择填空题 略。 这道题是绘图题&#xff0c;没什么难度&#xff0c;大家绘制这2个正十边形要注意&#xff1a;一是不要超出舞台&#xff1b;二是这2个正十边形不要相交。 这里就不给出具体程序了…

数睿通2.0数据服务功能模块发布

文章目录引言API 目录API 权限API 日志结语引言 数睿通 2.0 之前基本完成了数据集成和数据开发两大模块&#xff0c;也因此得到了一些朋友的帮助和支持&#xff0c;在此由衷的表示感谢&#xff0c;你们的支持便是我们更新的最大动力&#xff01; 目前&#xff0c;数据服务模块…

色环电阻的阻值如何识别

这种是色环电阻&#xff0c;其外表有一圈圈不同颜色的色环&#xff0c;现在在一些电器和电源电路中还有使用。下面的两种色环电阻它颜色还不一样&#xff0c;一个蓝色&#xff0c;一个土黄色&#xff0c;其实这个蓝色的属于金属膜色环电阻&#xff0c;外表涂的是一层金属膜&…

狂神说:面向对象(三)——多态

多态// 对象能执行什么方法&#xff0c;主要看对象左边的类型&#xff0c;和右边的没有关系多态&#xff1a;同一方法可以根据发送对象的不同而采用不同的行为方式父类&#xff1a;public class Person {public void run(){System.out.println("Person > run");}}…

【并发编程学习篇】深入理解CountDownLatch

一、CountDownLatch介绍 CountDownLatch&#xff08;闭锁&#xff09;是一个同步协助类&#xff0c;允许一个或多个线程等待&#xff0c;直到其他线程完成操作集。CountDownLatch使用给定的计数值&#xff08;count&#xff09;初始化。await方法会阻塞直到当前的计数值被coun…

只需四步,手把手教你打造专属数字人

伴随ChatGPT的问世&#xff0c;在技术与商业运作上都日渐发展成熟的数字人产业正持续升温。去年9月&#xff0c;北京市发布了国内首个数字人产业专项支持政策&#xff0c;提出将依托国家文化专网将数字人纳入文化数据服务平台。以数字人、ChatGPT为代表的互联网3.0创新应用产业…

kali下安装Volatility

一、About Volatility Volatility是一款开源内存取证框架&#xff0c;能够对导出的内存镜像进行分析&#xff0c;通过获取内核数据结构&#xff0c;使用插件获取内存的详细情况以及系统的运行状态。 Volatility是一款非常强大的内存取证工具,它是由来自全世界的数百位知名安全…

FAST‘23《λ-IO: A Unified IO Stack for Computational Storage》论文解读

FAST’23《λ-IO: A Unified IO Stack for Computational Storage》论文解读 Data:2023-2-27 Ref: Z. Yang et al., “λ-IO: A Unified IO Stack for Computational Storage,” in 21st USENIX Conference on File and Storage Technologies (FAST 23), Santa Clara, CA, Feb.…

数据可视化第二版-03部分-06章-比较与排序

文章目录数据可视化第二版-03部分-06章-比较与排序总结可视化视角-比较与排序代码实现创建虚拟环境1. python版本管理2.切换到指定版本后安装虚拟环境切换路径到文件当前路径柱形图环形柱状图子弹图哑铃图雷达图词云图教材截图数据可视化第二版-03部分-06章-比较与排序 总结 …

Java 多线程 --- 多线程的相关概念

Java 多线程 --- 多线程的相关概念Race Condition 问题并发编程的性质 --- 原子性, 可见性, 有序性上下文切换 (Context Switch)线程的一些故障 --- 死锁, 活锁, 饥饿死锁 (Deadlock)活锁(Livelock)死锁和活锁的区别饥饿(Starvation)背景: 操作系统 — 线程/进程 同步 Race Co…

【unity学习记录】Canvas Group组件

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Canvas Group组件 Canvas Group画布组介绍详解1. Alpha2. Interactable3. Blocks Raycasts4. Ignore Parent Groups介绍 画布组…

6.0.4:GrapeCity Documents for Excel GcExcel Crack

在更短的时间内生成 Excel 电子表格&#xff0c;不依赖于 Excel&#xff01; 在任何应用程序中转换、计算、格式化和解析电子表格。 快速高效&#xff1a;其轻巧的尺寸意味着 Documents for Excel 针对快速处理大型 Excel 文档进行了优化 使用适用于 Windows、Linux 和 Mac 的…

JVM 学习(2)—简单理解强、软、弱、虚 Java 四大引用

一、Java 引用概述 Java 中出现四种引用是为了更加灵活地管理对象的生命周期&#xff0c;以便在不同场景下灵活地处理对象的回收问题。不同类型的引用在垃圾回收时的处理方式不同&#xff0c;可以用来实现不同的垃圾回收策略。Java 目前将其分成四类&#xff0c;类图如下&…

mysql一两种索引方式hash和btree

1. Hash索引&#xff1a; Hash 索引结构的特殊性&#xff0c;其检索效率非常高&#xff0c;索引的检索可以一次定位&#xff0c;不像B-Tree 索引需要从根节点到枝节点&#xff0c;最后才能访问到页节点这样多次的IO访问&#xff0c;所以 Hash 索引的查询效率要远高于 B-Tree 索…

信息安全概论之《密码编码学与网络安全----原理与实践(第八版)》

前言&#xff1a;在信息安全概论课程的学习中&#xff0c;参考了《密码编码学与网络安全----原理与实践&#xff08;第八版&#xff09;》一书。以下内容为以课件为主要参考&#xff0c;课本内容与网络资源为辅助参考&#xff0c;学习该课程后作出的总结。 一、信息安全概述 1…