以下整理自: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. linux之fstab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...

  2. day-7心得

    面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  3. Springboot项目打成jar包运行 和 打成war包 外部tomcat运行

    Jar打包方式运行 类型为jar时 <packaging>jar</packaging> 1.使用命令mvn clean  package 打包 2.使用java –jar 包 ...

  4. C#递归所以部门展示到TreeView

    C#递归所以部门展示到TreeView 1.首先是数据库表的设计 新建一张部门表:TestUser表 1.ID自增int主键 2.DeptName:nchar(10)3.DeptCode:nchar( ...

  5. Oracle11gR2--删除数据库

    1. 停止ORACLE数据库 [oracle@localhost oracle]$ ps -ef|grep smon oracle 72550 1 0 14:23 ? 00:00:00 ora_smo ...

  6. 【知识碎片】python 篇

    领域:运维 网站 游戏 搜索 嵌入式 C/S软件 Openstack二次开发 绿色版:Portable Python 面向对象.解释型动态语言 env python 切换版也好使,自己寻找系统中pyt ...

  7. 新浪微博logo已经去掉了“新浪”二字

    如果有一天我能做出一个产品,它的命名就以我所在的行业命名该多好啊,可惜那只是一个梦.但这样的梦新浪微博却实现了,今天我登陆新浪微博的时候发 现logo已经去掉了“新浪”二字,我开始还以为我自己的电脑网 ...

  8. Unity3D Asset 导入&导出

    [Unity3D Asset 导入&导出] 通过Assets->Export Package..菜单可以导出当前选中Assets.若没有选中Assets,则会导出全部assets. 在弹 ...

  9. Hadoop之MapReduce(一)简介及简单案例

    简介 Hadoop MapReduce是一个分布式运算编程框架,基于该框架能够容易地编写应用程序,进而处理海量数据的计算. MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算. ...

  10. 值得一做》关于数学与递推 BZOJ1002 (BZOJ第一页计划)(normal+)

    什么都不说先甩题目 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之 ...