C++ Code Snippet -- 如何高效记录耗时操作

73 阅读1分钟

在开发过程中,经常会遇到需要计算某个方法的时间耗时,一般的操作是在开始和结束的时候分别设置上时间戳,这样需要每次都定义,比较麻烦,可以尝试插入一个记录时间的对象,利用对象的创建和析构时间计算出来方法的耗时。

1. 定义记录耗时的类

#include <iostream>
#include <chrono>

/**
 * 记录耗时
 */
class TimerCost {
public:
    TimerCost(const char *name) : m_Name(name), m_Stopped(false) {
        m_StartTime = std::chrono::high_resolution_clock::now();
    }

    ~TimerCost() {
        if (!m_Stopped) {
            stop();
        }
    }

    void stop() {
        auto endTime = std::chrono::high_resolution_clock::now();
        long long start = std::chrono::time_point_cast<std::chrono::microseconds>(
                m_StartTime).time_since_epoch().count();
        long long end = std::chrono::time_point_cast<std::chrono::microseconds>(
                endTime).time_since_epoch().count();

        auto duration = end - start;
        double ms = duration * 0.001;
        std::cout << m_Name <<" 耗时:" << ms<< " 毫秒" << std::endl;
        m_Stopped = true;
    }

private:
    const char *m_Name;
    bool m_Stopped;
    std::chrono::time_point<std::chrono::steady_clock> m_StartTime;
};

2. 使用操作

#include "TimerCost.h"
#include <chrono>
#include <thread>
void simulateTimeConsumingTask()
{
    // 定义一个记录耗时的对象,在方法结束时,自动析构
    TimerCost timer(__FUNCTION__);
    
    std::cout << "开始模拟耗时任务..." << std::endl;
    // 休眠5秒钟
    std::this_thread::sleep_for(std::chrono::seconds(5));
    std::cout << "模拟耗时任务完成!" << std::endl;
}

int main() {
    simulateTimeConsumingTask();
    return 0;
}

3. 使用效果

image.png