用标准 C++ 取得时间

Cplusplus
回复
ccc
初来炸道
初来炸道
帖子: 7
注册时间: 2016年09月18日 21:50
联系:

用标准 C++ 取得时间

帖子 ccc »

gui 和 graphics 中时间的控制很重要,场景的进度和时间的控制非常重要。标准 C++ 的 chrono 提供了非常强大的功能,chrono 很复杂,远远超出了一个 getTime 的功能。
double getTime_v1() {
static auto start = std::chrono::high_resolution_clock::now();
auto now = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::nanoseconds>(now-start).count()*1.0/1000000000;
}
double getTime_v2() {
static auto start = std::chrono::high_resolution_clock::now();
auto now = std::chrono::high_resolution_clock::now();
return std::chrono::duration<double>(now-start).count();
}
start 变量的定义定为 static, 这样只在 getTime 函数第一次被调用时才会执行初始化语句,非 static 变量每次调用都初始化一次。

1. 用哪个时钟?high_resolution_clock 如其名,高精度时钟,不过还有一个版本:system_clock 系统时钟,是应该使用高精度时钟还是系统时钟呢?high_resolution_clock 提供了所有系统上的一致性表现,然而需要硬件和操作系统能有这个能力,在某些苛刻的平台上会 fail,比如某些早期的 arm;system_clock 一般应该总是可用,它根据是操作系统的能力判断。

2. 用 v1 还是 v2?你可以从 v2 版的 getTime 看到,模板参数是 double,可以知道内部进行高浮点数运算;v1 版的是整数运算,时钟每次 tick 一下计数器增加一个单位,因为实际上的计算机处理器,根本就不存在浮点数,只有整数。因为 v2 版的浮点数运算需要浪费一定的时间,所以 v2 版的 getTime 没有 v1 版的 getTime 那么准确。getTime 是用来得到当前程序运行时间的,然而它自己如果浪费了 “多那么一点点” 的时间的话,就不够精确了。你可以自己去测试这一点,进行百万级复杂度的计算,然后分别用 getTime_v1 和 getTime_v2 去测量时间,v2 就是比 v1 多出那么一点点的时间。
double t = getTime_*();
do_some_big_thing();
double delta_t = getTime_*() - t;
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

Re: 用标准 C++ 取得时间

帖子 523066680 »

STL很强大,最近才开始学,相见恨晚。(以前在学习方面太任性,白白消耗太多的时间~ 最后发现C++才是正道)
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客