C++ 时间处理-统计函数运行时间

  • [1. 关键词](#1. 关键词)
  • [2. 问题](#2. 问题)
  • [3. 解决思路](#3. 解决思路)
  • [4. 代码实现](#4. 代码实现)
    • [4.1. timecount.h](#4.1. timecount.h)
    • [4.2. timecount.cpp](#4.2. timecount.cpp)
  • [5. 测试代码](#5. 测试代码)
  • [6. 运行结果](#6. 运行结果)
  • [7. 源码地址](#7. 源码地址)

1. 关键词

C++ 时间处理 统计函数运行时间 跨平台

2. 问题

C++如何简单便捷地实现"函数运行时间的统计"功能?

3. 解决思路

  • 类的构造函数:会在对象初始化的时候被调用。
  • 类的析构函数:会在对象销毁的时候被调用。
  • 局部对象的生命周期:对象实例化(也就是初始化)时开始,退出作用域时结束。

4. 代码实现

4.1. timecount.h

cpp 复制代码
#pragma once

#include <cstdint>
#include <atomic>
#include <string>

namespace cutl
{
    /**
     * @brief A simple time counter class to measure the execution time of a function.
     *
     */
    class timecount
    {
    public:
        /**
         * @brief Construct a new timecount object
         * The constructor will record the begin time of the function calling.
         * @param func_name
         */
        timecount(const std::string &func_name);
        /**
         * @brief Destroy the timecount object
         * The desctructor will record the end time of the function calling and calculate the execution time.
         */
        ~timecount();

    private:
        std::string func_name_;
        std::atomic<uint64_t> start_time_;
    };

} // namespace

4.2. timecount.cpp

cpp 复制代码
#include "timecount.h"
#include "timeutil.h"
#include "strfmt.h"
#include "inner/logger.h"

namespace cutl
{
    timecount::timecount(const std::string &func_name)
        : func_name_(func_name)
    {
        start_time_ = clocktime(timeunit::us);
    }

    timecount::~timecount()
    {
        auto end_time = clocktime(timeunit::us);
        auto duration = end_time - start_time_;
        auto text = "[timecount] " + func_name_ + " used " + fmt_timeduration_us(duration);
        CUTL_LOGGER.info("", text);
    }
} // namespace

5. 测试代码

cpp 复制代码
#pragma once

#include <iostream>
#include "timecount.h"
#include "common.hpp"

void TestTimecount()
{
    PrintTitle("timecount");

    cutl::timecount tcount("TestTimecount");
    std::cout << "TestTimecount begin" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "TestTimecount end" << std::endl;
}

6. 运行结果

bash 复制代码
=============================================timecount==============================================
TestTimecount begin
TestTimecount end
[2024-05-19 22:34:35.853][I]]0x7ff844a9b100](cutl)  [timecount] TestTimecount used 01s.004955us

7. 源码地址

更多详细代码,请查看本人写的C++ 通用工具库: common_util, 本项目已开源,代码简洁,且有详细的文档和Demo。

相关推荐
Larry_Yanan2 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
J ..3 小时前
C++ 多线程编程基础与 std::thread 使用
c++
你的冰西瓜3 小时前
C++标准模板库(STL)全面解析
开发语言·c++·stl
闻缺陷则喜何志丹4 小时前
【计算几何】仿射变换与齐次矩阵
c++·数学·算法·矩阵·计算几何
chen_ever4 小时前
Protobuf详解(从安装到实战)
c++·rpc·信息与通信
hmbbcsm4 小时前
python做题小记(八)
开发语言·c++·算法
再睡一夏就好4 小时前
深入Linux线程:从轻量级进程到双TCB架构
linux·运维·服务器·c++·学习·架构·线程
特立独行的猫a5 小时前
C++开发中的Pimpl机制与类声明机制深度解析:现代C++的编译解耦艺术
开发语言·c++·pimpl
GoWjw5 小时前
在C&C++指针的惯用方法
c语言·开发语言·c++
君义_noip5 小时前
信息学奥赛一本通 1453:移动玩具 | 洛谷 P4289 [HAOI2008] 移动玩具
c++·算法·信息学奥赛·csp-s