C++ 11 chrono
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相关推荐
- C++11 chrono 库
C++11 chrono 图解 1 设计一个时间日期库需要哪些要素 1.1 时间的计量形式 1.2 时间的计量精度 1.3 时间点 2 chrono库类 2.1 三种时钟 2.2 多种精度 2.3 时 ...
- c++11 chrono全面解析(最高可达纳秒级别的精度)
chrono是c++ 11中的时间库,提供计时,时钟等功能. 学习chrono,关键是理解里面时间段(Durations).时间点(Time points)的概念. 1.精度: 时钟节拍(时间精度): ...
- C++11 chrono的基本使用
说明 C++11增加了不少优秀的新特性,这里记录下常用的chrono时间相关的操作. 获取当前时间 #include <chrono>//获取当前时间点 转换为从1970-01-01 00 ...
- C++11: chrono
2019独角兽企业重金招聘Python工程师标准>>> chrono是一个time-library,要使用chrono这个库需要#include<chrono>. 通常要 ...
- c++11 chrono
std::chrono std::chrono::minutes-分 std::chrono::hours-小时 std::chrono::seconds-秒 std::chrono::millise ...
- 六种c++计时器函数(秒级到微妙级)
以下所有代码都有使用Sleep()延时函数,需 #include <Windows.h> 1.使用clock(),ms级别计时器 : double start = clock();Slee ...
- VS2015正式版出炉-----
Visual Studio 2015 RTM 2015 年 7 月 20 日 今天,我们非常高兴地宣布发行 Visual Studio 2015 RTM. 此 Visual Studio 的交付厂商版 ...
- C++日期和时间编程总结
C++日期和时间编程总结.md C++11 的日期和时间编程内容在 C++ Primer(第五版)这本书并没有介绍,目前网上的文章又大多质量堪忧或者不成系统,故写下这篇文章用作自己的技术沉淀和技术分享 ...
- 002_chrono
title 002<chrono> 让Chrome下载资源更容易 众所周知, chrome原生的下载功能并不好用, 以查看下载任务为例, 我们需要点击两次(点击右上角 三个点 , 点击下载 ...
最新文章
- centOS下调整swap
- 一步步学习 Spring Data 系列之JPA(一)
- maven generating project in batch mode hang
- 为什么还有那么多人用SVN?
- Linux内核 触摸板,Linux下关闭触摸板和触摸杆
- UIWebView的离线缓存
- Linux有待提高的七个领域
- 实际测试中,经常发现摄像头断线几分钟
- 在Arcgis中利用Python编写脚本批量化处理数据实例
- 关于ARMA模型的R语言实现
- java happen-before_Java happen-before规则
- 浅述Docker的容器编排
- 笔记本计算机回收站在哪里,电脑回收站不见了怎么办 四种方法教你快速解决问题【图文教程】...
- cnki 爬虫类论文 推荐
- win10网络重置后,网卡驱动消失且装不上驱动的以及驱动带感叹号的解决办法
- 港股中的老千,千万别碰!
- osg 根据两个点的经纬度计算方位角
- 状语从句不是简单句_简单句、复合句Gloria总结
- 一种求周期二元线性序列的极小多项式的方法
- Coding Interview University学习
热门文章
- 细说setTimeout/setImmediate/process.nextTick的区别
- winscp通过隧道连接(另一台服务器)—— SSH代理(ssh-agent)及SSH代理转发(agent-forwarding)功能介绍
- 01-复杂度2 Maximum Subsequence Sum
- 安装软件出现错误代码0x8007007e
- 尚观学习-ule-文件操作
- Caesar密码(凯撒密码)
- 第15关 夫拉姆谷仓地带(难度高!)
- matlab复数向极坐标转换_[matlab 极坐标]利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。谁能写出函数和调用语句?...
- python猜拳游戏编程代码_求助,用python编写一个猜拳游戏程序,要求有这样的开头...
- Java开发之计算机概述01