c++11时间相关库(chrono)
以下整理自: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)的更多相关文章
- C++11 标准库也有坑(time-chrono)
恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time() 只能取到秒(win和linux) 想试试看能不能找到 至少可以取到毫秒的, 于是, 就找 ...
- 漫谈C++11 Thread库之原子操作
我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程 ...
- 漫谈c++11 Thread库之使写多线程程序
c++11中最重要的特性之一就是对多线程的支持了,然而<c++ primer>5th却没有这部分内容的介绍,着实人有点遗憾.在网上了解到了一些关于thread库的内容.这是几个比较不错的学 ...
- c++11 Thread库写多线程程序
一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一 ...
- dpdk-18.11开发库编译安装
简介 dpdk官网 安装 下载 点击下载地址,选择合适的版本下载.这里下载DPDK 18.11.0 (LTS)版本. 编译 将下载的dpdk-18.11.tar.xz上传服务器,解压,这里放在了/op ...
- 11. 标准库浏览 – Part II
第二部分包含了支持专业编程工作所需的更高级的模块,这些模块很少出现在小脚本中. 11.1. 输出格式 reprlib 模块为大型的或深度嵌套的容器缩写显示提供了 :repr() 函数的一个定制版本: ...
- C++11随机数库
random随机数库 C++11引入了新的随机数生成机制,那就是<random>随机数库,支持多种伪随机数生成算法,多种连续和离散随机数分布算法,以及封装了真正的随机数生成引擎random ...
- c++11 时间相关操作练习
博客和书籍资料 来自该地址 https://www.cnblogs.com/qicosmos/category/490693.html 自行编写相应代码进行学习 // TimeTest.cpp: 定义 ...
- C++11标准库中cstdio头文件新增的5个格式化I/O函数学习
刚开始学网络编程,稍微扩展书上的简单C/S程序时,发现以前太忽略标准I/O这一块,查官网发现C++11新增了几个格式化I/O函数. snprintf 将格式化输出写入到有大小限制的缓存中 vfs ...
随机推荐
- Flask之单元测试
5.2单元测试 为什么要测试? Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段].其中测试阶段通过人工或自动来运行测试某个系统的功能.目的是检验其是否满足需求,并得出 ...
- ACCESS中如何比较日期和时间,使用DateDiff函数
DateDiff,语法如下:DateDiff( 间隔字符, 日期1, 日期2 [,firstdayofweek[, firstweekofyear]])一般使用 DateDiff( 间隔字符, 日期1 ...
- vue 构建前端项目并关联github
这几天尝试用node开发一个网站,后端的接口已经初步开发完成,现在开始构建前端的项目,记录下过程,在学习下吧. 用vue-cli 构建项目,myproject.(构架过程略过) 每次在本地构建项目后和 ...
- 如何搭建自己的SPRING INITIALIZR server
这两天在慕课学Spring boot ,用idea通过spring initializr新建项目 即使用代理连不上.无奈. 参考了 GitHub - spring-io/initializr: A w ...
- Gym - 101128C:Canvas Painting
这个就是哈夫曼树哇~ 我们仨英语太差了,跟榜时候才看出来是哈夫曼树雾 一个优先队列就可以搞定 #include <cstdio> #include <algorithm> #i ...
- EF删除,查询,Linq查询,Lambda查询,修改链接字符串
(1)//删除操作 public bool delete() { try { a_context = new AEntities(); b1 = new Table_1(); //删除只需要写主键就行 ...
- C++中内存区域的划分
栈存储区 那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆存储区(自由存储区) 那些由new或者malloc分配的内存块,他们的释放编译器 ...
- qt数据库有效插件为空的情况
打了一周的环境,从ubuntu到win7,搭建环境的时间比写代码的时间都多.先简单的介绍一下我搭建的环境不是纯QT环境,是一个芬兰的软件开发商开发出来的SDK里面完全融合qt,其中qt是以单独的目录存 ...
- 数据库 MySQL 之 表操作、存储引擎
数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名( 字段名1 ...
- c++ 指向类成员函数的函数指针
// ConsoleApplication34.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...