C++ 日期和时间编程总结(四)
no::seconds |
duration</*至少 35 位的有符号整数类型*/> |
std::chrono::minutes |
duration</*至少 29 位的有符号整数类型*/, std::ratio<60» |
std::chrono::hours |
duration</*至少 23 位的有符号整数类型*/, std::ratio<3600» |
duration 类的 count() 成员函数返回时间间隔的具体数值。
3.4.1,时间间隔转换函数 duration_cast
因为有各种 duration 表示不同的时长单位,所以 chrono 库提供了 duration_cast 函数来换 duration 类型,其声明如下:
template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep,Period>& d);
其定义比较复杂,但是我们日常使用可以直接使用 auto 推导函数返回对象类型,示例代码如下:
#include <iostream>
#include <chrono>
#include <ratio>
#include <thread>
void f()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
f();
auto t2 = std::chrono::high_resolution_clock::now();
// 整数时长:要求 duration_cast
auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
// 小数时长:不要求 duration_cast
std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
std::cout << "f() took " << fp_ms.count() << " ms, "
<< "or " << int_ms.count() << " whole milliseconds\n";
// 程序输出结果: f() took 1000.23 ms, or 1000 whole milliseconds
}
3.5,时间点 time_point
std::chrono::time_point 表示时间中的一个点(一个具体时间),如上个世纪80年代、你的生日、今天下午、火车出发时间等,只要它能用计算机时钟表示。其包含了时钟和时长两个信息。它被实现成如同存储一个 Duration 类型的自 Clock 的纪元起始开始的时间间隔的值。其声明如下:
template<
class Clock,
class Duration = typename Clock::duration
> class time_point;
时钟的 now() 函数返回的值就是一个时间点。time_point 中的 time_since_epoch() 返回从其时钟起点开始的时长。可以通过两个时间点相减计算一个时间间隔,下面是代码示例:
#include <stdio.h> /* printf */
#include <iostream>
#include <chrono>
#include <math.h>
using namespace std;
void time_point_test()
{
auto start = chrono::steady_clock::now();
double sum = 0;
for(int i = 0; i < 100000000; i++) {
sum += sqrt(i);
}
auto end = chrono::steady_clock::now();
// 通过两个时间点相减计算一个时间间隔
auto time_diff = end - start;
// 将时间间隔单位转化为毫秒
auto duration = chrono::duration_cast<chrono::milliseconds>(time_diff);
cout << "Sqrt Operation cost : " << duration.count() << "ms" << endl;
}
int main()
{
time_point_test();
// 程序输出结果: Sqrt Operation cost : 838ms
}
3.5.1,时间点运算
时间点有加法和减法操作,计算结果和常识一致:时间点 + 时长 = 时间点;时间点 - 时间点 = 时长。
参考资料
文章首发于我的 github 仓库-cv算法工程师成长之路,欢迎关注我的公众号-嵌入式视觉。 本人水平有限,文章如有问题,欢迎及时指出。如果看完文章有所收获,一定要先点赞后收藏。毕竟,赠人玫瑰,手有余香。
|