Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

1. 关键词

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

2. 问题

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

3. 解决思路

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

4. 代码实现

4.1. timecount.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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. 测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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. 运行结果

1
2
3
4
=============================================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。

推荐阅读
C++时间处理2-获取系统开机到现在的运行时间 C++时间处理2-获取系统开机到现在的运行时间 C++时间处理1-获取当前时间戳 C++时间处理1-获取当前时间戳 Linux C++ 开发9 - 手把手教你使用gprof性能分析工具 Linux C++ 开发9 - 手把手教你使用gprof性能分析工具

评论