C++中一种对代码块计时的方法

当我们写了一串逻辑代码后,如果尝试去计算某几行代码(以下称代码块)耗时,最普通的做法是记录代码块前和后的时间戳,然后计算时间戳的差值:

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 
#include "timer.h"

int main(int argc, char *argv[])
{

    {   // 直接创建作用域,但是不影响上下代码逻辑
        Timer timer("block 1 costtime");  // 参数只是作为输出耗时时的前缀名称,方便辨识
        int a = 1;
        int b = 2;
    }      // 离开作用域,timer对象被销毁,该过程调用析构函数打印其存在的时长

    float c = 3;

    return 0;
}

在进入作用域时,Timer将实例化对象调用构造函数开始计时,在退出作用域时,Timer被销毁调用析构函数计算并打印耗时时间。

所以统计任意代码块的耗时都可以用{ }封装起来,再实例化一个Timer即可。

Timer类如何实现?首先结构如下:

|
|---timer.h       # 头文件
|---timer.cpp     # 实现文件

timer.h的内容如下:

#ifndef _TIMER_H_
#define _TIMER_H_

#include 
#include 

class Timer
{
public:
    Timer(const std::string &name);
    ~Timer();
   
private:
    std::string m_name;
    std::chrono::time_point<std::chrono::high_resolution_clock> m_start;
};
#endif

timer.cpp的内容如下:

#include 
#include 
#include 

Timer::Timer(const std::string &name) : m_name(name), m_start(std::chrono::high_resolution_clock::now()) {}

Timer::~Timer()
{
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end - m_start;
    std::cout << m_name << " elapsed time: " << elapsed.count() << " ms\n";
}

你可能感兴趣的:(c++,开发语言)