std::chrono库的使用

2023-11-02 20:50
文章标签 使用 std chrono

本文主要是介绍std::chrono库的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

std::chrono学习笔记

chrono是一个模版库,提供关于日期和时间的一些功能。
先举个例子,如果我想知道看这篇博文花了多长时间:
(1)首先需要有一个能提供时钟(clock)的设备(电脑、手机、手表、挂钟等)
(2)记录开始阅读和结束阅读的时间点(time_point);
(3)计算两次的时间之差就是阅读持续时间(duration)。
chrono的模板库常用的3个模板也是这3个:duration、time_point、clock
在使用时,需要引用chrono头文件。

#include <chrono>

clock

既然谈到时间,总需要找一个时钟作为参照吧,就像我们想知道当前时间,可以看墙上的挂钟,可以看手表,可以看手机。clock就是这个时钟,在计算机中一般都会有一套或多套时钟系统供程序使用。
在std::chrono库中,有3种时钟:

  • system_clock
  • steady_clock
  • hight_definition_clock
    一般情况下,他们3个没有太大的区别,hight_definition_clock、steady_clock仅仅是system_clock的typedef,但是有为什么要区分呢,因为在有些情况下,他们是存在差异的。

情况1:system_clock和steady_clock的差异
比如windows系统可以提供时钟,如果认为时间不准,我们还可以进行调整。在没有调整时间前,system_clock和steady_clck是一样的,他们的读数都是单调匀速增加的;但是如果调整时间后,它们两者的读数就会出现差异,system_clock的读数就会出现跳变,而steady_clock依然保持线性单调递增,不受clock调整的影响,这个特点非常方便我们统计时间耗时(duration)。
情况2:system_clock与hight_definition_clock的差异
如果系统提供的时钟(clock)不止一种,有的时钟精度高(分辨率),有的精度低,hight_definition_clock使用时精度最高的clock,但是system_clock就不一定了。

clock主要用于获取当前的时间,通过now()获取,方法如下。关于time_point在下面讲解。

std::chrono::system_clock::time_point current_time = std::chrono::system_clock::now();

time_point

time_point是具体的时间,比如某年某月某日几点几分几秒,time_point依赖于clock的计时。
通过上文中的方法可以将当前时间赋值给current_time,current_time的时间数据是一个数字,表示当前时间是经过了多少个计时单位了,那么计时的起点是什么时候呢?为了让不同地区、不同国家、不同的设备有一个统一标准,可以通过time_since_epoch().count()计算以 1970 年 1 月 1 日 00:00 UTC 为起点的时间。

std::chrono::system_clock::time_point current_time = std::chrono::system_clock::now();
cout << "current_time = " << current_time.time_since_epoch().count() << endl;

duration

duration表示一段时间,也就是持续时间,是一个时间的长度,比如1个小时、35秒、33毫秒。
它的模板类如下,包含两个参数,Rep是必需要指定的,Period是可选择输入的,简单的说Rep表示数据的类型,如int、float等;Period可以理解为时间的单位,默认是1秒,自己也可自定义修改,就是duration每增加1与之对应的时间是多少。

template <class Rep, class Period = ratio<1> > class duration;
  • 使用默认1秒作为计量单位
typedef std::chrono::duration<int> t_int;
typedef std::chrono::duration<double> t_float;
// duration每增加1,表示的时间的变化量为1秒
  • 使用自定义的值作为计量单位
// duration每增加1,时间的变化为0.001秒
typedef std::chrono::duration<float, std::ratio<1,1000>> mSec_float; // 1/1000秒作为计量单位,也就毫秒
// duration每增加1,时间的变化为60秒
typedef std::chrono::duration<int, ratio<60, 1>> minute_int; // 60/1秒为计量电位,也就是1分钟

上面ratio有两个参数ratio<num, den>,那么实际的单位为num/den秒。

除了可以通过ratio来自定义时间的计量单位,也可以使用std库中预定义好的变量,本质上也是使用ratio定义好的。
在这里插入图片描述
使用方法如下

std::chrono::duration<int, std::milli>  // 毫秒
std::chrono::duration<int, std::micro>  // 微秒
std::chrono::duration<int, std::nano>   // 纳秒
  • 如何定义、修改duration的变量
#include <chrono>
#include <iostream>
using namespace std;
int main(int argc, int** argv[]) {typedef std::chrono::duration<int, std::milli> mSec_t;mSec_t t1(2000);cout << "t1 = " << t1.count() << endl;// t1 = 3000; // 不能这样赋值t1 = mSec_t(3000); // 修改变量cout << "t1 = " << t1.count() << endl;system("pause");return 0;
}

一个例子

通过获取两个时刻的时间,然后计算时间长度。

#include <chrono>
#include <iostream>
#include <thread>
#include <ctime>using namespace std;int main() {// DEMO:通过获取两个时刻的时间,然后计算时间长度using namespace std::chrono;// Step one: 定义一个clocktypedef system_clock sys_clk_t;// Step two: 分别获取两个时刻的时间typedef system_clock::time_point time_point_t;// 第1个时间time_point_t time01 = sys_clk_t::now();// 延时5秒std::this_thread::sleep_for(std::chrono::duration<int>(5));// 第2个时间time_point_t time02 = sys_clk_t::now();// Step three: 计算时间差cout << "dt_time(system_clock period) = " << (time02 - time01).count() << endl;typedef duration<int, std::ratio<1, 1000>> mili_sec_t;cout << "\ndt_time(user define period) = " << (time_point_cast<mili_sec_t>(time02) - time_point_cast<mili_sec_t>(time01)).count() << endl;system("pause");return 0;
}

运行结果如下:
在这里插入图片描述
system_clock的计时单位是10-7秒。

这篇关于std::chrono库的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333235

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他