首页 > 编程语言 >C++11时间日期库chrono的使用

C++11时间日期库chrono的使用

时间:2023-08-14 22:31:59浏览次数:42  
标签:11 clock auto chrono C++ 时间 duration 时钟

chrono是C++11中新加入的时间日期操作库,可以方便地进行时间日期操作,主要包含了:duration, time_point, clock。

C++11时间日期库chrono的使用_高精度

时钟与时间点

chrono中用time_point模板类表示时间点,其支持基本算术操作;不同时钟clock分别返回其对应类型的时间点。

clock

C++11时间日期库chrono的使用_高精度_02

时钟是从一个时点开始,按照某个刻度的计数;chrono同时提供了三种时钟(通过now()获取当前时间点):

  • system_clock:系统时钟,相对epoch(1970-01-01 00:00:00UTC)的时间间隔;
  • steady_clock:单调时钟,只能增长(后一次调用now()得到的时间总是比前一次的值大);一般是相对于系统启动时间的时间间隔;
  • high_resolution_clock:高精度时钟(当前系统能提供的最高精度时钟,很可能就是steady_clock),也是单调的;

需要得到绝对时点的场景使用system_clock;需要得到时间间隔,且不受系统时间修改而受影响时使用steady_clock。

C++11时间日期库chrono的使用_模板类_03

时间显示

在C++20中直接有to_stream直接输出system_clock时钟;但在此之前,只能通过间接的方式来输出:

auto tNow = system_clock::now();
auto tmNow = system_clock::to_time_t(tNow);
auto locNow = std::localtime(&tmNow);
cout<<std::put_time(locNow, "%Y-%m-%d %H:%M:%S")<<endl; // 2019-12-20 19:35:12

system_clock::from_time_t(...)可以把time_t类型时间转换为time_point,便于chrono使用。

运行计时

通过steady_clock/high_resolution_clock可方便的进行计时:

public:
  explicit XRunTime{bool bStart){
    if(bStart) Restart();
  }

  void Restart(){
    m_tpStart = high_resolution_clock::now();
  }

  double Stop(){
    return operator()();
  }
  double operator()(void){
    auto tpEnd = high_resolution_clock::now();
    auto elap = tpEnd - m_tpStart;
    return (double)elap.count() / std::nano::den; //返回运行的秒数,如1.00345
  }
}

时间间隔duration

chrono中使用duration模板类来表示时间间隔,并定义了从小时到纳秒的时间间隔。

duration模板

duration使用一个数值(表示时钟数)和分数(ratio)来表示具体间隔。支持基本的算术运算,并通过count()获取具体的时钟数。

template<typename _Rep, typename _Period = ratio<1>>
struct duration
{
  typedef _Rep   rep;

  constexpr _Rep count() const{
    return (_MyRep);
  }
  ...
private:
  _Rep  _MyRep;  //时钟计数
};

基准是秒,并依次定义了常用的间隔,如:

typedef duration<long long> seconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long, ratio<3600>> hours;

不同的时间间隔可以直接进行算术运算,如休眠需要毫秒参数,我们可以封装接收秒与毫秒的接口:

void MySleep(int nSec, int nMillSec){
  std::chrono::seconds secs(nSec);
  std::chrono::milliseconds mills(nMillSec);
  std::this_thread::sleep_for(secs+mills);
}

duration_cast

使用duration_cast可以方便的在不同时间单位间进行转换,如:

auto sec=seconds(123);
auto minu=duration_cast<minutes>(sec);
cout<<sec.count()<<","<<minu.count()<<endl; // 123,2

ratio

C++11时间日期库chrono的使用_时间间隔_04

ratio是一个分数模板类,第一个参数为分子,第二个参数为分母;通过静态成员可获取:

  • num:分子
  • den:分母
typedef ratio<1, 1000> milli;
typedef ratio<1000, 1> kilo;
cout<<milli::den<<endl; // 1000

C++11时间日期库chrono的使用_高精度_05

标签:11,clock,auto,chrono,C++,时间,duration,时钟
From: https://blog.51cto.com/u_15641375/7082413

相关文章

  • c++20 format基本使用
    下面代码是一个使用format的例子#include<iostream>#include<cmath>#include<format>intmain(){doubleprincipal{1000};doublerate{0.5};std::cout<<std::format("Initialprincipal:{:>7.2f}\n",principal);......
  • C++中的堆
    C++中的堆一、堆的概念堆是一种特殊的树形数据结构,其每个节点都有一个值。通常所说的堆的数据结构,是指二叉堆,即完全二叉树。在C++中,标准库提供了一些用于操作堆的函数,如make_heap(),push_heap(),pop_heap()等。二、堆的特点每个节点的值都大于或等于(最大堆)或小于或等于(最小......
  • C/C++内存管理
    一、C/C++内存分布看下面这段代码:intglobalVar=1;staticintstaticGlobalVar=1;voidTest1(){ staticintstaticVar=1; intlocalVar=1; intnum1[10]={1,2,3,4}; charchar2[]="abcd"; constchar*pChar3="abcd"; int*ptr1=(int*......
  • C/C++内存管理
    一、C/C++内存分布看下面这段代码:intglobalVar=1;staticintstaticGlobalVar=1;voidTest1(){ staticintstaticVar=1; intlocalVar=1; intnum1[10]={1,2,3,4}; charchar2[]="abcd"; constchar*pChar3="abcd"; int*ptr1=(int*......
  • NodeJS系列(11)- Next.js 框架 (四)
    在“NodeJS系列(8)-Next.js框架(一)”里,我们简单介绍了Next.js的安装配置,创建了nextjs-demo项目,讲解和演示了Next.js项目的运行、路由(Routing)、页面布局(Layout)等内容。在“NodeJS系列(9)-Next.js框架(二)”里,我们在nextjs-demo项目基础上,讲解和演示了Next.js项目......
  • 解决方案 | 预装win11如何退回win10?
    1、问题刚买的新电脑预装win11,我之前用的是win10(推送win11不下5次,就是不装),我的建议是但凡你一直在用win10不要抱有任何幻想装win11。即使自认为比较懂得调教电脑的人在经历一些折腾后,仍觉得用着win11不方便。枚举几个例子:①win11右键是折叠菜单(也就是二级菜单),几乎99%情况下需要点......
  • AMEYA360:DNB1101大唐恩智浦工规级电池管理芯片
    大唐恩智浦作为全球领先的半导体供应商,一直致力于为全球客户提供高质量的解决方案。在电池管理芯片领域,大唐恩智浦推出的DNB1101可谓是一款工规级的电池管理芯片,其卓越的性能和可靠性成为市场上备受全球领先的半导体供应商,一直致力于为全球客户提供高质量的解决方案。在电池管......
  • 一文玩转MQTT (ESP8266 DHT11 MQTT MYSQL方案)
    本文我们来聊一聊esp8266利用mqtt协议进行通信。并将数据数据存入数据库的操作。关于MQTTMQTT(消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。搭建MQTT服务器......
  • 评测R7 6800u和i7 1165g7差距 r76800u和i71165g7对比
    aMD锐龙76800U处理器,采用全新的Zen3+架构,6nm制程工艺,8大核16线程,最大加速时钟频率可达4.7GHz,三级缓存16MB。锐龙76800U处理器核显为AMDRadeon680M显卡,RDNA2架构,12显示核心,2200MHz显示频率,相较于前代显示性能提升约2倍选R76800u还是i71165g这些点很重......
  • Dedecms V110最新版RCE---Tricks
    前言刚发现Dedecms更新了发布版本,顺便测试一下之前的day有没有修复,突然想到了新的tricks去实现RCE。文章发布的时候估计比较晚了,一直没时间写了。利用/uploads/dede/article_string_mix.php/uploads/dede/article_template_rand.php/uploads/dede/sys_task.php......我发......