一.前言

   在我们写程序过程中,有时候需要测试我们的程序语句执行时间的耗时,当前也是有很多的库提供我们去使用,一直没有良好的跨平台的库可以提供出来;而且一般这种代码也是由我们程序员自己调用系统的库来进行,但是往往会出现精度不足和不支持跨平台等问题;C++11中引进boost中的chrono库;可实现高精度时钟,可以做到纳秒级;

二.chrono库


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

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

三.实践

例1:

运行结果:

附例1代码:

#ifndef _TimerClock_hpp_
#define _TimerClock_hpp_#include <iostream>
#include <chrono>using namespace std;
using namespace std::chrono;class TimerClock
{public:TimerClock(){update();}~TimerClock(){}void update(){_start = high_resolution_clock::now();}//获取秒double getTimerSecond(){return getTimerMicroSec() * 0.000001;}//获取毫秒double getTimerMilliSec(){return getTimerMicroSec()*0.001;}//获取微妙long long getTimerMicroSec(){//当前时钟减去开始时钟的countreturn duration_cast<microseconds>(high_resolution_clock::now() - _start).count();}
private:time_point<high_resolution_clock>_start;
};#endifint main()
{TimerClock TC;int sum = 0;TC.update();for (int i = 0; i > 100000; i++){sum++;}cout << "cost time:" << TC.getTimerMilliSec() << "ms" << endl;cout << "cost time:" << TC.getTimerMicroSec() << "us" << endl;return 0;
}

四.时间处理

4.1涉及的类

  system_clock(主要关注), steady_clock, high_resolution_clock
  time_point
  duration
  seconds等时间的表示类

4.2涉及的函数

4.3如何获取当前的时间

例2

附例2代码:

#include <chrono>
#include <iostream>
using namespace std;int main()
{// 获取当天的时间auto curTimePoint = chrono::system_clock::now();// 获取当前的时间戳cout<<"获取当前的时间戳:";cout << curTimePoint.time_since_epoch().count() << endl;// 把当前时间向后推10秒钟auto d1 = chrono::seconds(10);auto time2 = curTimePoint + d1;cout<<"把当前时间向后推10秒钟:";cout << time2.time_since_epoch().count() << endl;// 转为经过的小时cout<<"转为经过的小时:";cout << chrono::duration_cast<chrono::hours>(time2.time_since_epoch()).count() << endl;//转为time_t的结构cout<<"转为time_t的结构:";time_t t = chrono::system_clock::to_time_t(time2);cout << t << endl;
}

五 Duration

duration定义为:

  其中Rep表示计次数的算数类型,可以是整数或者小数,比如设置为double就能表示以小数计时。
  Period表示被包含时长类型的,一般用于不同时长类型的转换比如文档中给出的不同时长单位定义:

chrono时长类型


  要改变duration的计时单位可以使用duration_cast
例3:

  其中now返回的是一个std::chrono::time_point类型,默认情况下duration记录当前的时间段有多少秒
  chrono提供了三个时钟,一般用system_clock,想要高精度就用high_resolution_clock
附例3代码:

#include <iostream>
#include <chrono>
#include <thread>
#include <ratio>
using namespace std;int main()
{//auto start = chrono::system_clock::now();auto start = chrono::high_resolution_clock::now();std::this_thread::sleep_for(std::chrono::seconds(1));//auto end = chrono::system_clock::now();auto end = chrono::high_resolution_clock::now();std::chrono::duration<double> diff = end - start;auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start);chrono::duration<double, std::nano> fp_nanos = end - start;cout<<"use "<<diff.count()<<" s\n";cout<<"use "<<nanos.count()<<" nanos\n";cout<<"use "<<fp_nanos.count()<<" nanos\n";return 0;
}

参考博文:https://mp.weixin.qq.com/s/ZZPTOJ5qFe2lKfSWThQx-w
参考博文:https://mp.weixin.qq.com/s/dtEELMznaeI5cvvHOghQRA
参考博文:https://www.jianshu.com/p/0ccbf45491de

C++新特性探究(十七):chrono计時器相关推荐

  1. Java 8新特性探究(二)深入解析默认方法

    转载自 Java 8新特性探究(二)深入解析默认方法 什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. ...

  2. C++新特性探究(9.1):functor仿函数探究

    相关博文:C++新特性探究(九):functor仿函数 Functor 对象模拟函数   把类对象,像函数名一样使用.   仿函数(functor),就是使一个类的使用看上去像一个函数.其实现就是类中 ...

  3. C++新特性探究(13.6):右值引用再探究

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  4. C++新特性探究(13.5):右值引用

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  5. C++新特性探究(十六):move constructor移动构造

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  6. C++新特性探究(十五):bind

    相关博文:C++新特性探究(十四):function 相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essenti ...

  7. C++新特性探究(十四):function

    相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essential C++>笔记之设计一个泛型算法(二) 相关 ...

  8. C++新特性探究(十三):右值引用(r-value ref)探究

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  9. C++新特性探究(十):Lambda

    一. 匿名函数   简短函数,就地书写,调用.即Lambda存在的意义,常用于取代作回调用的简短函数指针与仿函数.   就地书写,因只有函数体,即无函数名,也称匿名函数. 格式 最小的 Lambda: ...

最新文章

  1. python搞笑代码-为PYTHON添加define功能【搞笑代码】
  2. linux只显示文件,ls如何只显示文件名
  3. 潘天佑博士2014微软学生夏令营演讲:如何培养领导力
  4. 【QGIS入门实战精品教程】4.6:QGIS实现栅格(影像、DEM)的拼接与掩膜提取
  5. Java EE安全性API向前发展
  6. 【生物】基因编辑研究方向全面盘点,一文带你了解基因魔剪的前世今生
  7. Python解析access数据库(mdb文件或者accdb文件)
  8. java oracle时间格式转换_oracle时间格式转换问题 ORA-01810: format code appears twice--转...
  9. Zookeeper Java客户端搭建
  10. blender快捷键记录-基本所有场景通用
  11. python xlwt 写入Excel
  12. android 定时器 误差,运动会计时器(PC+安卓)版本
  13. 图书馆管理系统 Java
  14. 数字政府智慧政务一网通办解决方案2022
  15. Netty诡异报错did not read anything but decoded a message
  16. Flask外部访问服务器最简单的操作
  17. ECharts: 绘制立体柱状图【圆柱体】
  18. 逻辑与,逻辑或||和逻辑非!的区别
  19. 经典SQL学习笔记 (四)-子查询
  20. ​LeetCode刷题实战488:祖玛游戏

热门文章

  1. 基于JAVA+Swing+MYSQL的进销存管理系统
  2. 基于JAVA+Servlet+JSP+MYSQL的网上书城
  3. 利用DB Link搞定Oracle两个数据库间的表同步
  4. java中的容器问题
  5. Android视频: YUV转RGB
  6. 解决 Package test is missing dependencies for the following libraries: libcrypto.so.1.0.0
  7. 第二部分:开发简要指南-第六章 使用Fragments构建动态UI
  8. 分支程序设计02 - 零基础入门学习C语言11
  9. hbase shell 命令行从入门到放弃
  10. Python+pillow计算椭圆图形几何中心