在我们实际开发中,尤其对于算法工程师来说,有时候为了比较不同的算法或者优化算法,需要计算各个算法运行的时间或者关键代码段的运行时间,以此来衡量算法在速度上的优劣或者进行代码优化时的一个参考。
因此对于程序员来说,如何计算程序的运行时间就是一个需要解决的基本问题了。对于C++来说,在C++11之前并没有与时间相关的直接的标准库,基本上是使用C语言中对时间进行处理的相关功能,或者直接使用和平台相关的系统API。
然而在C++11之后,C++标准库提供了一个用来处理日期和时间的程序库,常被称为chrono程序库
,因为它的特性被定义于<chrono>
。有了这个程序库,就不用再去寻找关于不同平台的时间处理API了,直接支持跨平台,现在想想,使用C++(尤其是Modern C++)是多么舒服的一件事呀。
好了,现在我们可以直接使用<chrono>
库中提供的相关功能来进行程序运行时间的测量了,如:
#include <chrono>
...
auto start = std::chrono::steady_clock::now();
for (int i = 0; i < 1024; ++i) {
std::cout << "hello C++11 !" << std::endl;
}
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double, std::micro> elapsed = end - start; // std::micro 表示以微秒为时间单位
std::cout<< "time: " << elapsed.count() << "us" << std::endl;
...
现在可以对需要进行测量的代码段或算法按如上方法进行测量,二话不说,拿起键盘就是复制粘贴,额…
当然可以按照上述方式去做,但是为了今后使用的方便以及代码的复用,所以对其进行了一个简单的封装,并将其放在了我的 Github 上,如果有需要的读者可以直接拿来使用。
基于<chrono>
,将C++程序运行时间的计算封装成了AlgoTime
模板类,支持以不同的时间单位进行计算,比如纳秒、微妙、毫秒、秒等等;另外也可以直接使用像 AlgoTimeNs
(纳秒)、AlgoTimeUs
(微秒)、AlgoTimeMs
(毫秒)等类型,具体实现可参见源码。
下面就以AlgoTimeUs
为例子,做一个简单的使用示例:
#include "MeasureAlgoTime.hpp"
int main() {
// 创建一个以“微秒”为单位的算法时间对象
// 当然也可以使用其它时间单位的时间对象,如毫秒、秒等
Tools::Time::AlgoTimeUs time;
// 启动计时
time.start();
for (int i = 0; i < 1024; ++i) {
std::cout << "hello C++11 !" << std::endl;
}
// 直接在标准输出设备中输出程序的运行时间
time.printElapsed();
// 或者使用以下方式进行运行时间的输出
auto elapsed = time.elapsed();
std::cout << elapsed << "us" << std::endl;
return 0;
}
在gcc 7.3.0
上的运行结果如下所示: