如何简洁高效地测量若干函数的总耗时?
多函数总耗时统计方案(完善优化版)
嘿,你这个用RAII(资源获取即初始化)自动计时的思路真的很巧妙!我帮你把未完成的代码补全并做了细节优化,这样就能轻松实现多个函数的总耗时统计,而且用法超省心。
完整实现代码
#include <map> #include <iostream> #include <chrono> #include <string> using namespace std; // 全局存储函数名与对应总耗时(单位:秒) map<string, double> time_data; struct TimeGuard { string func_name; chrono::high_resolution_clock::time_point start_time; // 构造时自动记录函数名与开始时间 TimeGuard(string name) : func_name(move(name)), start_time(chrono::high_resolution_clock::now()) {} // 析构时自动计算耗时并累加到全局统计容器 ~TimeGuard() { auto end_time = chrono::high_resolution_clock::now(); chrono::duration<double> elapsed = end_time - start_time; time_data[func_name] += elapsed.count(); } }; // 统一打印所有函数的耗时统计结果 void print_time_stats() { cout << "\n=== 函数耗时统计结果 ===" << endl; for (const auto& [func_name, total_time] : time_data) { cout << "函数 [" << func_name << "] 总耗时: " << total_time << " 秒" << endl; } } // ------------------- 使用示例 ------------------- void image_process_func() { TimeGuard timer(__func__); // 用__func__自动获取当前函数名,避免手动拼写错误 // 模拟图像处理逻辑 for (int i = 0; i < 150000000; ++i); } void data_calculate_func() { TimeGuard timer(__func__); // 模拟数据计算逻辑 for (int i = 0; i < 300000000; ++i); } int main() { // 多次调用函数,测试耗时累加效果 image_process_func(); image_process_func(); data_calculate_func(); print_time_stats(); return 0; }
核心设计亮点
- 自动计时无遗漏:
TimeGuard对象在函数创建时启动计时,函数执行完毕自动销毁时计算耗时,完全不用手动调用“结束计时”,彻底避免漏写的问题。 - 总耗时自动累加:用
map<string, double>存储统计数据,同一个函数多次调用时,耗时会自动累加,完美满足“总耗时”的统计需求。 - 高精度计时:使用
chrono::high_resolution_clock,这是C++标准库中精度最高的时钟,能覆盖绝大多数性能测试场景。 - 减少人为错误:用编译器内置宏
__func__自动获取当前函数名,不用手动输入字符串,避免拼写错误。
运行效果示例
执行后会输出类似这样的结果:
=== 函数耗时统计结果 === 函数 [image_process_func] 总耗时: 0.281 秒 函数 [data_calculate_func] 总耗时: 0.563 秒
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

