以下整理自:https://www.2cto.com/kf/201404/290706.html

chrono 库主要包含了三种类型:时间间隔 Duration、时钟 Clocks 和时间点 Time point

duration:

duration 表示一段时间间隔,用来记录时间长度,可以表示几秒钟、几分钟或者几个小时的时间间隔

duration 的原型是:

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

第一个模板参数Rep是一个数值类型,表示时钟个数;第二个模板参数是一个默认模板参数std::ratio,它的原型是:

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

它表示每个时钟周期的秒数,其中第一个模板参数 Num 代表分子,Denom 代表分母,分母默认为 1,ratio 代表的是一个分子除以分母的分数值,比如 ratio<2> 代表一个时钟周期是两秒,ratio<60> 代表了一分钟,ratio<60*60> 代表一个小时,ratio<60*60*24> 代表一天。而ratio<1, 1000> 代表的则是1/1000秒即一毫秒,ratio<1, 1000000> 代表一微秒,ratio<1, 1000000000> 代表一纳秒。标准库为了方便使用,就定义了一些常用的时间间隔,如时、分、秒、毫秒、微秒和纳秒,在chrono命名空间下,它们的定义如下:

 typedef duration <Rep, ratio<,>> hours;

 typedef duration <Rep, ratio<,>> minutes;

 typedef duration <Rep, ratio<,>> seconds;

 typedef duration <Rep, ratio<,>> milliseconds;

 typedef duration <Rep, ratio<,>> microseconds;

 typedef duration <Rep, ratio<,>> nanoseconds;

通过定义这些常用的时间间隔类型,我们能方便的使用它们,比如线程的休眠:

std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒

std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //休眠100毫秒

chrono 还提供了获取时间间隔的时钟周期个数的方法 count()

count 以及 duration 的基本用法:

 #include <iostream>
#include <chrono>
using namespace std; int main(void) {
std::chrono::milliseconds ms{};//3毫秒 std::chrono::microseconds us = * ms;//6000微秒 std::chrono::duration<double, std::ratio<, >> hz(3.5);
//hz为3.5个周期时间长度,每个周期为1/30s cout << ms.count() << endl;//3 一个周期为1s
cout << us.count() << endl;//6000 一个周期为1us
cout << hz.count() << endl;//3.5 return ;
}

时间间隔之间可以做运算,比如下面的例子中计算两端时间间隔的差值:

 #include <iostream>
#include <chrono>
using namespace std; int main(void) {
std::chrono::minutes t1();//10分钟 std::chrono::seconds t2( );//60秒 std::chrono::seconds t3 = t1 - t2; //t3 的时间周期为 second
std::cout << t3.count() << " second" << std::endl; //通过 duration_cast 将时间周期转化为 minutes
cout << chrono::duration_cast<chrono::minutes>(t3).count() << " minutes" << endl; // 输出:
// 540 second
// 9 minutes return ;
}

注意:我们还可以通过duration_cast<>() 来将当前的时钟周期转换为其它的时钟周期,如我可以把秒的时钟周期转换为分钟的时钟周期,然后通过 count 来获取转换后的分钟时间间隔

time point:

time_point 表示一个时间点,用来获取 1970.1.1 以来的秒数和当前的时间, 可以做一些时间的比较和算术运算,可以和 ctime 库结合起来显示时间。time_point 必须要 clock 来计时,time_point 有一个函数 time_from_eproch() 用来获得1970年1月1日到 time_point 时间经过的 duration。下面的例子计算当前时间距离1970年1月一日有多少天:

 #include <iostream>
#include <ratio>
#include <chrono>
using namespace std; int main(void) {
using namespace std::chrono;
typedef duration<int, std::ratio< * * >> day_type; time_point<system_clock, day_type> today = time_point_cast<day_type>(system_clock::now());
cout << today.time_since_epoch().count() << " days since epoch" << endl; // 输出:
// 17598 days since epoch return ;
}

time_point还支持一些算术元算,比如两个time_point的差值时钟周期数,还可以和duration相加减。下面的例子输出前一天和后一天的日期:

 #include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>
using namespace std; int main(void) {
using namespace std::chrono;
system_clock::time_point now = system_clock::now();//获得当前时间 std::time_t last = system_clock::to_time_t(now - std::chrono::hours());
std::time_t next = system_clock::to_time_t(now + std::chrono::hours()); return ;
}

clocks

表示当前的系统时钟,内部有 time_point, duration, Rep, Period 等信息,它主要用来获取当前时间,以及实现 time_t 和 time_point 的相互转换。Clocks包含三种时钟:

system_clock:从系统获取的时钟;

steady_clock:不能被修改的时钟;

high_resolution_clock:高精度时钟,实际上是 system_clock 或者 steady_clock 的别名

可以通过 now() 来获取当前时间点:

 #include <iostream>
#include <chrono>
#include <ratio>
using namespace std; int main(void) {
using namespace std::chrono; time_point<system_clock> t1 = system_clock::now();
int cnt = 1e9;
while(--cnt);
time_point<system_clock> t2 = system_clock::now(); cout << (t2 - t1).count() << endl;
//通过 duration_cast<>() 将周期转化为 secondse
cout << std::chrono::duration_cast<seconds>( t2-t1 ).count() << endl; // 输出:
// 2669897000
// return ;
}

可以利用 high_resolution_clock 来实现一个类似于 boost.timer 的定时器

 #include <iostream>
#include <chrono>
#define ll long long
using namespace std;
using namespace std::chrono; class Timer{
public:
Timer() : m_begin(high_resolution_clock::now()) {}
//重置当前时间
void reset() {
m_begin = high_resolution_clock::now();
} //默认输出毫秒
ll elapsed() const {
return duration_cast<chrono::milliseconds>(high_resolution_clock::now() - m_begin).count();
} //微秒
ll elapsed_micro() const {
return duration_cast<chrono::microseconds>(high_resolution_clock::now() - m_begin).count();
} //纳秒
ll elapsed_nano() const {
return duration_cast<chrono::nanoseconds>(high_resolution_clock::now() - m_begin).count();
} //秒
ll elapsed_seconds() const {
return duration_cast<chrono::seconds>(high_resolution_clock::now() - m_begin).count();
} //分
ll elapsed_minutes() const {
return duration_cast<chrono::minutes>(high_resolution_clock::now() - m_begin).count();
} //时
ll elapsed_hours() const {
return duration_cast<chrono::hours>(high_resolution_clock::now() - m_begin).count();
} private:
time_point<high_resolution_clock> m_begin; }; void fun(int n) {
while(--n);
} int main(void) {
Timer t;//开始记时
fun(1e9);
cout << t.elapsed_nano() << endl;
cout << t.elapsed_micro() << endl;
cout << t.elapsed() << endl;
cout << t.elapsed_seconds() << endl;
cout << t.elapsed_minutes() << endl;
cout << t.elapsed_hours() << endl; // 输出:
// 2673899000
// 2673899
// 2674
// 2
// 0
// return ;
}

c++11时间相关库(chrono)的更多相关文章

  1. C++11 标准库也有坑(time-chrono)

    恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time()   只能取到秒(win和linux) 想试试看能不能找到 至少可以取到毫秒的, 于是, 就找 ...

  2. 漫谈C++11 Thread库之原子操作

    我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程 ...

  3. 漫谈c++11 Thread库之使写多线程程序

    c++11中最重要的特性之一就是对多线程的支持了,然而<c++ primer>5th却没有这部分内容的介绍,着实人有点遗憾.在网上了解到了一些关于thread库的内容.这是几个比较不错的学 ...

  4. c++11 Thread库写多线程程序

    一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一 ...

  5. dpdk-18.11开发库编译安装

    简介 dpdk官网 安装 下载 点击下载地址,选择合适的版本下载.这里下载DPDK 18.11.0 (LTS)版本. 编译 将下载的dpdk-18.11.tar.xz上传服务器,解压,这里放在了/op ...

  6. 11. 标准库浏览 – Part II

    第二部分包含了支持专业编程工作所需的更高级的模块,这些模块很少出现在小脚本中. 11.1. 输出格式 reprlib 模块为大型的或深度嵌套的容器缩写显示提供了 :repr() 函数的一个定制版本: ...

  7. C++11随机数库

    random随机数库 C++11引入了新的随机数生成机制,那就是<random>随机数库,支持多种伪随机数生成算法,多种连续和离散随机数分布算法,以及封装了真正的随机数生成引擎random ...

  8. c++11 时间相关操作练习

    博客和书籍资料 来自该地址 https://www.cnblogs.com/qicosmos/category/490693.html 自行编写相应代码进行学习 // TimeTest.cpp: 定义 ...

  9. C++11标准库中cstdio头文件新增的5个格式化I/O函数学习

    刚开始学网络编程,稍微扩展书上的简单C/S程序时,发现以前太忽略标准I/O这一块,查官网发现C++11新增了几个格式化I/O函数. snprintf    将格式化输出写入到有大小限制的缓存中 vfs ...

随机推荐

  1. Chrome和IE的xss过滤器分析总结

    chrome的xss过滤器叫xssAuditor,类似IE的xssFilter,但是他们有很大的内在区别 chrome xssAuditor工作原理 chrome的xss检测名称为 xssAudito ...

  2. IDA Pro 权威指南学习笔记(七) - 其他 IDA 显示窗口

    默认情况下 IDA 不会打开这些窗口,可通过 View -> Open Subviews 命令打开 Strings 窗口(Strings) Strings 窗口中显示的是从二进制文件中提取出的一 ...

  3. java成神之——线程操作

    线程 Future CountDownLatch Multithreading synchronized Thread Producer-Consumer 获取线程状态 线程池 ThreadLocal ...

  4. javascript中的类方法、构造方法、原型方法的对比

    如果你已经接触js很久了,那么应该可以看看我总结的是否正确,如果你刚开始学习,那么通过我的总结,你可以更快的区别他们,记得我刚接触js时,这一块反正是模糊了很久! 1,长相的区别: function ...

  5. .Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》

    在Framwork 体系下 WebAPI项目 会有很多默认特性,例如:Get查询竟然支持三种数组查询方式 1.https://localhost:44390/api/values?status=1&a ...

  6. apache配置多个虚拟主机 localhost访问不了解决方案

    在httpd-vhosts.conf,重定向localhost <VirtualHost *:80>    ServerAdmin webmaster@dummy-host2.exampl ...

  7. 【292】Python 关于中文字符串的操作

    参考:什么是字符编码? 参考:Unicode 和 UTF-8 有何区别? 参考:python中文decode和encode转码 一.相关说明 Python 中关于字符串的操作只限于英文字母,当进行中文 ...

  8. Spring MVC的配置

    一.添加依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>sprin ...

  9. 用Golang为Python编写模块

    Go里面需要显示的引入C模块, 让编译器支持生成动态链接库, 并且在代码中可以使用C语言的数据类型,这个至关重要. Calling Go code from Python code 摘取一个最简单例子 ...

  10. python中descriptor的应用

    [python中descriptor的应用] 1.classmethod. 1)classmethod的应用. 2)classmethod原理. 2.staticmethod. 1)staticmet ...