两三年前第一次接触C++,是在国内的实战教材上面。在那本教材上慢慢学会了C++的基本编程,那时以为已经学会了,于是就没有再去学C++的基础。几个月前听说C++更新到了C++17,觉得很诧异,再去查查,发现自己以前学的是早就已经淘汰了的C++89,而C++ 发展到现在已经有C++99、C++11、C++14和C++17了,顿时觉得不行了,必须再去学。

C++ 11的学习很坎坷,基本上C++89的内容除了基本语法外,一点用都没有了,简直不是同一门语言,尤其在于标准库(C++ Standard )的巨大变化,更是难以适应,以前的时间获取、随机数等等很多都淘汰了。在这里我不得不批判一下国内的教材,你一个2016年的教材,长篇大论在讲述C++89干什么呢?简直令人无语。

好了回归正题,现在就讲一下C++17的计时器。

计时器属于标准库的一个工具组件,定义在头文件中,属于子命名空间std::chrono,因此,使用前应当加入以下语句:

using namespace std::chrono;

或者在每次使用时加入前缀chrono::

首先是获取当前时间,可以对于三种不同的时钟调用now()函数:system_clock、steady_clock、high_resolution_clock,这三种时钟的区别是:第一个是系统时钟,依赖于系统调节,但是如果在计时时手贱调了时间就GG了;第二个是硬件时间,也就是最稳定的时间,与主板上面的时间脉冲保持同步,几乎没有误差;第三个称为“最精确时间”,通过一堆算法达到最高皮秒增量的时间,基于硬件时间,但没有硬件时间稳定。

获取时间点的方法很简单,示例如下:
auto t=steady_clock::now();

其他的时钟同理,把名字改一改就可以了。

此时变量t的类型是steady_clock::time_point。接下来是利用两个时间点来获取时间间隔:
auto d=t1-t2;

其中t1、t2分别是时间点变量,也就是上面获取的变量。

但是此时d并不是普通数字变量,不可以直接用,因此需要一个转换,示例如下:
auto time=duration_cast<milliseconds>(d).count();

此时time中保存的就是时间间隔的数字了,其中milliseconds可以改成nanoseconds、seconds等等。

C++的时间获取是不是很简单?现在再也不用用time()忍受高占用率时计时变慢了吧!

Last modification:April 17, 2022
If you think my article is useful to you, please feel free to appreciate