1. 持续时间 duration
template<class rep, class period = ratio<1>> class duration;
class rep: 滴答数
class period: 滴答周期,默认1秒
1) 常用方法
count / zero / min / max
支持算术运算 + - * / % ++ – += -= *= /= %= (不同的period之间会自动转换)
2) 示例
duration<long, ratio<60>> d1(2); //2分钟 duration<long, ratio<1>> d2(30); //30秒 duration<double, ratio<60>> d3 = d1+d2; //2.5分 count << d3.count() << "minutes" << endl;
3) 标准定义
//x 64 bits表示:有符号整数类型,且位数至少为64位 typedef duration<x 64 bits, nano> nanoseconds; //纳秒 typedef duration<x 55 bits, micro> microseconds; //微秒 typedef duration<x 45 bits, milli> milliseconds; //毫秒 typedef duration<x 35 bits> seconds; //秒 typedef duration<x 29 bits, ratio<60>> minutes; //分 typedef duration<x 23 bits, ratio<3600>> hours; //时 //例 auto t = hours(1) + minutes(2) + seconds(45); count << seconds(t).count() << endl;
2. 时钟 clock
- system_clock 系统实时时钟的真实时间
- steady_clock time_point绝不递减的时钟
- high_resolution_clock 高精度时钟
1) 常用接口
// 均为静态接口 now() //获取类型为time_point的当前时间点 to_time_t() //将time_point转换为time_t类型 from_time_t() //将time_t转换为time_point类型
localtime可将time_t类型转换为tm表示的本地时间
2) 示例
//获取当前时间 #include <time.h> // time_t, locaktime, tm #include <iomanip> // put_time system_clock::time_point tpoint = system_clock::now(); time_t tt = system_clock::to_time_t(tpoint); tm* t = locaktime(&tt); cout << put_time(t, "%h:%m:%s") << endl;
//计算代码的执行时间 auto start = system_clock::now(); // ... to do something auto end = system_clock::now(); auto diff = end - start; cout << duration<double, milli>(diff).count() << "ms" << endl;
3. 时点 time_point
- time_point是一个时间点,存储相对于纪元(1970/01/01)的一个duration。
- time_since_epoch() 返回当前时间点到纪元的duration。
- 每一个time_point都关联一个clock,创建时需指定clock作为模板参数。
1) 构造函数
time_point(); //通过duration::zero初始化表示关联clock的纪元 time_point(const duration& d); //通过duration初始化表示纪元+d template<class duration2> time_point(const time_point<clock, duration2>& t); //通过t.time_since_epoch初始化
2) 示例
time_point<steady_clock> tp1; tp1 += minutes(10); auto d1 = tp1.time_since_epoch(); duration<double> d2(d1); cout << d2.count() << "seconds" << endl;
获取时间差
#include <chrono> #include <thread> auto begin = std::chrono::high_resolution_clock::now(); //起始 std::this_thread::sleep_for(std::chrono::milliseconds(800));//运行时长 auto end = std::chrono::high_resolution_clock::now();//结束 //第一种 使用duration_cast计算 auto duration1 = std::chrono::duration_cast<std::chrono::seconds>(end - begin); auto duration2 = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin); auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>(end - begin); auto duration4 = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin); std::cout << duration1.count() << std::endl; //本机测试结果: 0 std::cout << duration2.count() << std::endl; //本机测试结果: 812 std::cout << duration3.count() << std::endl; //本机测试结果: 812698 std::cout << duration4.count() << std::endl; //本机测试结果: 812698500 //第二种 使用durantion std::chrono::duration<double, std::ratio<1, 1>> elapsed1 = end - begin; std::chrono::duration<double, std::ratio<1, 1000>> elapsed2 = end - begin; std::chrono::duration<double, std::ratio<1, 1000000>> elapsed3 = end - begin; std::chrono::duration<double, std::ratio<1, 1000000000>> elapsed4 = end - begin; std::cout << elapsed1.count() << std::endl; //本机测试结果: 0.812698 std::cout << elapsed2.count() << std::endl; //本机测试结果: 812.698 std::cout << elapsed3.count() << std::endl; //本机测试结果: 812698 std::cout << std::fixed << std::setprecision(0) << elapsed4.count() << std::endl; //本机测试结果: 812698500
获取时间戳
//此处要用system_clock auto now = std::chrono::system_clock::now(); //下面用到2种转换方式,一种time_point_cast,一种duration_cast // 获取时间戳,单位为毫秒 auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now).time_since_epoch().count(); // 输出毫秒时间戳 std::cout << "milliseconds timestamp: " << ms << std::endl; // 获取时间戳,单位为秒 auto sec = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count(); // 输出秒时间戳 std::cout << "seconds timestamp: " << sec << std::endl;
到此这篇关于c++11 chrono时间库的使用小结的文章就介绍到这了,更多相关c++11 chrono时间库内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论