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

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完