chrono

目录

chrono

Abstract

duration

Abstract

How

Demo

time_point

Abstract

How

Demo

Clock

Abstract

How

Demo

Template


Abstract

c++11关于时间引入了chrono库,源于boost,功能强大,chrono主要有三个点:

  • duration
  • time_point
  • clocks

duration

Abstract

duration表示一段时间间隔

template<class Rep, class Period = std::ratio<1>> class duration

Rep是一个数值类型,表示时钟个数,Period表示每个时钟周期的秒数。Period的默认模板参数是std::ratio

template<std::intmax_t Num, std::intmax_t Denom = 1>
class ratio

Num代表分子,Denom代表分母。ratio<1>代表一个时钟周期是一秒,ratio<60>代表了一分钟,ratio<60*60>代表一个小时,ratio<1, 1000>代表一毫秒,ratio<1, 1000000>代表一微秒,ratio<1, 1000000000>代表一纳秒。

How

typedef duration <Rep, ratio<3600,1>> hours;
typedef duration <Rep, ratio<60,1>> minutes;
typedef duration <Rep, ratio<1,1>> seconds;
typedef duration <Rep, ratio<1,1000>> milliseconds;          //毫秒
typedef duration <Rep, ratio<1,1000000>> microseconds;       //微秒
typedef duration <Rep, ratio<1,1000000000>> nanoseconds;     //纳秒

Demo

#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
int main()
{this_thread::sleep_for(chrono::seconds(3));        //休眠3秒this_thread::sleep_for(chrono::milliseconds(100)); //休眠100毫秒cout << "Hello" << endl;getchar();return 0;
}

time_point

Abstract

描述的是一个具体的时间点

原型是:

template<class _Clock, class _Duration = typename _Clock::duration>
class time_point

这里的duration 就是上面提到的,Clock之后会介绍。

How

 time_point<system_clock, hours> h = time_point_cast<hours>(system_clock::now());

Demo

#include <iostream>
#include <chrono>
using namespace std;int main()
{using namespace std::chrono;time_point<system_clock, hours> h = time_point_cast<hours>(system_clock::now());cout << h.time_since_epoch().count() << " hours since epoch" << endl;getchar();return 0;
}

Clock

Abstract

clocks表示当前的系统时钟,内部有time_point, duration, Rep, Period等信息。

clocks包含三种时钟:

steady_clock 是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时;

system_clock 是系统的时钟;因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。

high_resolution_clock 是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。

How

steady_clock

稳定的时间间隔,表示相对时间,相对于系统开机启动的时间,无论系统时间如何被更改,后一次调用now()肯定比前一次调用now()的数值大,可用于计时。

相当于教练手中的秒表;只会增长,适合用于记录程序耗时.

system_clock

表示当前的系统时钟,可以用于获取当前时间

high_resolution_clock

high_resolution_clock表示系统可用的最高精度的时钟,实际上就是system_clock或者steady_clock其中一种的定义,官方没有说明具体是哪个,不同系统可能不一样,我之前看gcc chrono源码中high_resolution_clock是steady_clock的typedef。

Demo

// copied from http://www.informit.com/articles/article.aspx?p=1881386&seqNum=2;// Author: Nicolai M. Josuttis#include <chrono>#include <iostream>#include <iomanip>template <typename C>void printClockData (){using namespace std;cout << "- precision: ";// if time unit is less or equal one millisecondtypedef typename C::period P;// type of time unitif (ratio_less_equal<P,milli>::value) {// convert to and print as millisecondstypedef typename ratio_multiply<P,kilo>::type TT;cout << fixed << double(TT::num)/TT::den<< " milliseconds" << endl;}else {// print as secondscout << fixed << double(P::num)/P::den << " seconds" << endl;}cout << "- is_steady: " << boolalpha << C::is_steady << endl;}int main(){std::cout << "system_clock: " << std::endl;printClockData<std::chrono::system_clock>();std::cout << "\nhigh_resolution_clock: " << std::endl;printClockData<std::chrono::high_resolution_clock>();std::cout << "\nsteady_clock: " << std::endl;printClockData<std::chrono::steady_clock>();#ifdef _WIN32system("pause");#endifreturn 0;}system_clock:- precision: 0.000100 milliseconds- is_steady: falsehigh_resolution_clock:- precision: 0.000001 milliseconds- is_steady: truesteady_clock:- precision: 0.000001 milliseconds- is_steady: true

Template

#include <chrono>#define TIMERSTART(tag)  auto tag##_start = std::chrono::steady_clock::now(),tag##_end = tag##_start
#define TIMEREND(tag)  tag##_end =  std::chrono::steady_clock::now()
#define DURATION_s(tag) printf("%s costs %d s\n",#tag,std::chrono::duration_cast<std::chrono::seconds>(tag##_end - tag##_start).count())
#define DURATION_ms(tag) printf("%s costs %d ms\n",#tag,std::chrono::duration_cast<std::chrono::milliseconds>(tag##_end - tag##_start).count());
#define DURATION_us(tag) printf("%s costs %d us\n",#tag,std::chrono::duration_cast<std::chrono::microseconds>(tag##_end - tag##_start).count());
#define DURATION_ns(tag) printf("%s costs %d ns\n",#tag,std::chrono::duration_cast<std::chrono::nanoseconds>(tag##_end - tag##_start).count());// usage:
//   TIMERSTART(for_loop);
//   for (int i = 0; i < 100000; i++)
//   {
//       i*i;
//   }
//   TIMEREND(for_loop);
//   DURATION_ms(for_loop);

C++ 11 chrono相关推荐

  1. C++11 chrono 库

    C++11 chrono 图解 1 设计一个时间日期库需要哪些要素 1.1 时间的计量形式 1.2 时间的计量精度 1.3 时间点 2 chrono库类 2.1 三种时钟 2.2 多种精度 2.3 时 ...

  2. c++11 chrono全面解析(最高可达纳秒级别的精度)

    chrono是c++ 11中的时间库,提供计时,时钟等功能. 学习chrono,关键是理解里面时间段(Durations).时间点(Time points)的概念. 1.精度: 时钟节拍(时间精度): ...

  3. C++11 chrono的基本使用

    说明 C++11增加了不少优秀的新特性,这里记录下常用的chrono时间相关的操作. 获取当前时间 #include <chrono>//获取当前时间点 转换为从1970-01-01 00 ...

  4. C++11: chrono

    2019独角兽企业重金招聘Python工程师标准>>> chrono是一个time-library,要使用chrono这个库需要#include<chrono>. 通常要 ...

  5. c++11 chrono

    std::chrono std::chrono::minutes-分 std::chrono::hours-小时 std::chrono::seconds-秒 std::chrono::millise ...

  6. 六种c++计时器函数(秒级到微妙级)

    以下所有代码都有使用Sleep()延时函数,需 #include <Windows.h> 1.使用clock(),ms级别计时器 : double start = clock();Slee ...

  7. VS2015正式版出炉-----

    Visual Studio 2015 RTM 2015 年 7 月 20 日 今天,我们非常高兴地宣布发行 Visual Studio 2015 RTM. 此 Visual Studio 的交付厂商版 ...

  8. C++日期和时间编程总结

    C++日期和时间编程总结.md C++11 的日期和时间编程内容在 C++ Primer(第五版)这本书并没有介绍,目前网上的文章又大多质量堪忧或者不成系统,故写下这篇文章用作自己的技术沉淀和技术分享 ...

  9. 002_chrono

    title 002<chrono> 让Chrome下载资源更容易 众所周知, chrome原生的下载功能并不好用, 以查看下载任务为例, 我们需要点击两次(点击右上角 三个点 , 点击下载 ...

最新文章

  1. centOS下调整swap
  2. 一步步学习 Spring Data 系列之JPA(一)
  3. maven generating project in batch mode hang
  4. 为什么还有那么多人用SVN?
  5. Linux内核 触摸板,Linux下关闭触摸板和触摸杆
  6. UIWebView的离线缓存
  7. Linux有待提高的七个领域
  8. 实际测试中,经常发现摄像头断线几分钟
  9. 在Arcgis中利用Python编写脚本批量化处理数据实例
  10. 关于ARMA模型的R语言实现
  11. java happen-before_Java happen-before规则
  12. 浅述Docker的容器编排
  13. 笔记本计算机回收站在哪里,电脑回收站不见了怎么办 四种方法教你快速解决问题【图文教程】...
  14. cnki 爬虫类论文 推荐
  15. win10网络重置后,网卡驱动消失且装不上驱动的以及驱动带感叹号的解决办法
  16. 港股中的老千,千万别碰!
  17. osg 根据两个点的经纬度计算方位角
  18. 状语从句不是简单句_简单句、复合句Gloria总结
  19. 一种求周期二元线性序列的极小多项式的方法
  20. Coding Interview University学习

热门文章

  1. 细说setTimeout/setImmediate/process.nextTick的区别
  2. winscp通过隧道连接(另一台服务器)—— SSH代理(ssh-agent)及SSH代理转发(agent-forwarding)功能介绍
  3. 01-复杂度2 Maximum Subsequence Sum
  4. 安装软件出现错误代码0x8007007e
  5. 尚观学习-ule-文件操作
  6. Caesar密码(凯撒密码)
  7. 第15关 夫拉姆谷仓地带(难度高!)
  8. matlab复数向极坐标转换_[matlab 极坐标]利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。谁能写出函数和调用语句?...
  9. python猜拳游戏编程代码_求助,用python编写一个猜拳游戏程序,要求有这样的开头...
  10. Java开发之计算机概述01