当我们写了一串逻辑代码后,如果尝试去计算某几行代码(以下称代码块)耗时,最普通的做法是记录代码块前和后的时间戳,然后计算时间戳的差值:
auto time_start = std::chrono::system_clock::now();
// code block
auto time_end = std::chrono::system_clock::now();
std::cout << "time cost: " << std::chrono::duration_cast<std::chrono::milliseconds>(time_cuting - time_readimg).count() << "ms" << std::endl;
如果我们的代码的流程较长,而想知道多个代码块的耗时,这种做法可能就不那么优雅了
如果一个变量在作用域内被创建,那么在离开作用域时会被释放。如果一个类在作用域内被创建,那么在离开作用域时会调用析构函数,然后被释放。
如果是这样,那么可以设计一个计时类Timer。在作用域开始时创建,当离开作用域时,会自动调用析构函数。我们可以在创建的构造函数中记录时间戳,在析构函数中再次记录时间戳,然后计算输出两个之间戳的差值即可完成计时。
如果我们要对一个代码块计时,只需要将这个代码块放置在同一个作用域,并在最开始创建一个Timer对象即可。众所周知,{ }
就可以创建一个作用域,如下所示:
#include <iostream>
#include <timer.h>
int main(int argc, char *argv[])
{
{ // 直接创建作用域,但是不影响上下代码逻辑
Timer timer("block 1 costtime");
int a = 1;
int b = 2;
}
float c = 3;
return 0;
}
在进入作用域时,Timer
将实例化对象调用构造函数开始计时,在退出作用域时,Timer
被销毁调用析构函数计算并打印耗时时间。
所以统计任意代码块的耗时都可以用{ }
封装起来,再实例化一个Timer
即可。