用标准 C++ 取得时间

Cplusplus
ccc
初来炸道
初来炸道
帖子: 7
注册时间: 2016年09月18日 21:50
拥有现金: 锁定
Been thanked: 5 times
联系:

用标准 C++ 取得时间

帖子 #1 ccc » 2016年09月23日 11:44

gui 和 graphics 中时间的控制很重要,场景的进度和时间的控制非常重要。标准 C++ 的 chrono 提供了非常强大的功能,chrono 很复杂,远远超出了一个 getTime 的功能。
Code: [全选] [展开/收缩] [Download] (Untitled1.cpp)
  1. double getTime_v1() {
  2.     static auto start = std::chrono::high_resolution_clock::now();
  3.     auto now = std::chrono::high_resolution_clock::now();
  4.     return std::chrono::duration_cast<std::chrono::nanoseconds>(now-start).count()*1.0/1000000000;
  5. }


Code: [全选] [展开/收缩] [Download] (Untitled2.cpp)
  1. double getTime_v2() {
  2.     static auto start = std::chrono::high_resolution_clock::now();
  3.     auto now = std::chrono::high_resolution_clock::now();
  4.     return std::chrono::duration<double>(now-start).count();
  5. }


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 多出那么一点点的时间。

Code: [全选] [展开/收缩] [Download] (Untitled3.cpp)
  1. double t = getTime_*();
  2. do_some_big_thing();
  3. double delta_t = getTime_*() - t;

回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客