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库的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/zhoupian/article/details/104225605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/333235

相关文章

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接