C++统计代码执行耗时

文章目录

  • C++统计代码执行耗时
    • 1. 需求
    • 2. 代码结构
    • 3. CMakeLists文件
    • 4. 核心代码
    • 5. 使用测试

1. 需求

统计项目中代码执行耗时

2. 代码结构

# 程序依赖fmt库
.
├── CMakeLists.txt
├── SpendTimer.cpp
├── SpendTimer.h
├── test.cc
└── third_party└── fmt├── include│   └── fmt│       ├── chrono.h│       ├── color.h│       ├── compile.h│       ├── core.h│       ├── format.h│       ├── format-inl.h│       ├── locale.h│       ├── os.h│       ├── ostream.h│       ├── posix.h│       ├── printf.h│       └── ranges.h└── lib├── libfmt.a├── libfmt.so -> libfmt.so.7├── libfmt.so.7 -> libfmt.so.7.0.3└── libfmt.so.7.0.3

3. CMakeLists文件

# cmake版本设置
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
# 声明项目名称与语言
project(demo LANGUAGES C CXX)  # CMAKE_BUILD_TYPE配置构建类型,默认为空,可以选择Debug 或者 Release
if (NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(POSITION_INDEPENDENT_CODE 1)set(THIRD_PATH "./third_party")
# 添加第三方库的头文件搜索路径
include_directories(${THIRD_PATH}/fmt/include)
# 添加第三方库的搜索路径
link_directories(${THIRD_PATH}/fmt/lib)add_executable(test_main test.cc SpendTimer.cpp SpendTimer.h)
target_link_libraries(test_mainPUBLICfmt
)

4. 核心代码

/*** 程序执行耗时统计计时器,辅助计算代码执行时间* @note 不建议直接使用,应使用相关工具宏* @see SPEND_TIME, SPEND_TIME_MSG, SPEND_TIMG_CONTROL*/
class SpendTimer {public:/** 构造函数,记录当前系统时间 */explicit SpendTimer() : m_msg(""), m_start_time(std::chrono::steady_clock::now()) {}/*** 构造函数,记录当前系统时间* @param msg 辅导输出信息*/explicit SpendTimer(const std::string& msg): m_msg(msg), m_start_time(std::chrono::steady_clock::now()) {}/** 析构函数,计算从构造至析构所消耗的时间,并打印输出 */virtual ~SpendTimer() {if (m_closed) {return;}std::chrono::duration<double> sec = std::chrono::steady_clock::now() - m_start_time;double spend = 0;std::string unit;if (sec.count() < 0.000001) {spend = sec.count() * 1000000000;unit = "ns";} else if (sec.count() < 0.001) {spend = sec.count() * 1000000;unit = "us";} else if (sec.count() < 1) {spend = sec.count() * 1000;unit = "ms";} else if (sec.count() > 60) {spend = sec.count() / 60;unit = " m";} else if (sec.count() > 86400) {spend = sec.count() / 360;unit = " h";} else {spend = sec.count();unit = " s";}std::cout << fmt::format("spend time: {:>7.3f} {} | {} ", spend, unit, m_msg) << std::endl;}private:std::string m_msg;std::chrono::time_point<std::chrono::steady_clock> m_start_time;static bool m_closed;friend void close_spend_time();friend void open_spend_time();
};/// 全局关闭耗时打印输出
void close_spend_time();/// 全局开启耗时打印输出
void open_spend_time();inline void close_spend_time() {SpendTimer::m_closed = true;
}inline void open_spend_time() {SpendTimer::m_closed = false;
}

定义一个耗时计时器开启关闭状态类,如下:

/*** 耗时计时器开启关闭状态看守,记录之前的耗时开关状态,并置为指定状态,释放时恢复原状态*/
class SpendTimerGuad {public:/*** 构造函数,记录当前状态,并根据 open 指示开启或关闭耗时统计* @param open 是否开启耗时统计*/explicit SpendTimerGuad(bool open) : m_open(open) {if (open) {open_spend_time();} else {close_spend_time();}}/** 析构函数,退出当前指定状态,恢复原状态 */~SpendTimerGuad() {if (m_open) {close_spend_time();} else {open_spend_time();}}private:bool m_open;
};

定义一些使用工具宏:

#define SPEND_TIME(id)                                                    \std::stringstream sptmsg_buf_##id(std::stringstream::out);            \sptmsg_buf_##id << #id << " (" << __FILE__ << ":" << __LINE__ << ")"; \util::SpendTimer test_spend_timer_##id(sptmsg_buf_##id.str());/*** 代码执行耗时计时器,附带输出信息* @param id 自定义耗时计时器id* @param ... 符合 fmt::format 方式的输出信息*/
#define SPEND_TIME_MSG(id, ...)                      \std::string msg_##id = fmt::format(__VA_ARGS__); \util::SpendTimer test_spend_timer_##id(           \fmt::format("{} {} ({}:{})", #id, msg_##id, __FILE__, __LINE__)); /*** 用于动态控制当前代码块及其子块中的耗时计时器,主要用于测试代码中关闭和开启部分耗时统计*/
#define SPEND_TIMG_CONTROL(open) util::SpendTimerGuad spend_timer_guard_##open(open);

5. 使用测试

/** test.cc* brief: 测试耗时统计工具* Created on: 2020-9-5*     Author: erices*/
#include <iostream>#include "SpendTimer.h"uint64_t Fibonacci(uint32_t i)
{if (1 == i){return 1;}else if(2 == i){return 2;}return Fibonacci(i-1) + Fibonacci(i-2);
}int main()
{SPEND_TIMG_CONTROL(true);{SPEND_TIME_MSG(1, "Fibonacci(20) spend time ");Fibonacci(20);}{SPEND_TIME_MSG(2, "Fibonacci(30) spend time ");Fibonacci(30);}{SPEND_TIME_MSG(3, "Fibonacci(40) spend time ");Fibonacci(40);}return 0;
}
# 测试结果
➜  build ./test_main
spend time:  26.933 us | 1 Fibonacci(20) spend time  (/root/workspace/util/test.cc:29)
spend time:   3.047 ms | 2 Fibonacci(30) spend time  (/root/workspace/util/test.cc:34)
spend time: 346.920 ms | 3 Fibonacci(40) spend time  (/root/workspace/util/test.cc:39)

编译注意事项:

由于系统中装了多版本gcc库,故编译时需要显示指定版本。未指定版本

➜  build cmake ..
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/workspace/util/build

指定gcc版本:

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
➜  build cmake ..
-- The C compiler identification is GNU 9.1.0
-- The CXX compiler identification is GNU 9.1.0
-- Check for working C compiler: /apps/sylar/bin/gcc
-- Check for working C compiler: /apps/sylar/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /apps/sylar/bin/g++
-- Check for working CXX compiler: /apps/sylar/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/workspace/util/build

执行结果:

➜  build ./test_main
spend time:  26.933 us | 1 Fibonacci(20) spend time  (/root/workspace/util/test.cc:29)
spend time:   3.047 ms | 2 Fibonacci(30) spend time  (/root/workspace/util/test.cc:34)
spend time: 346.920 ms | 3 Fibonacci(40) spend time  (/root/workspace/util/test.cc:39)

C++统计代码执行耗时相关推荐

  1. 这样统计代码执行耗时,才足够优雅!

    作者 | Jitwxs 来源 | https://jitwxs.cn/5aa91d10.html 一.前言 代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时. 可能也是受 ...

  2. 使用StopWath统计代码执行耗时方法

    传统方法: Long startTime = System.currentTimeMillis();//业务代码Long endTime = System.currentTimeMillis();Lo ...

  3. 分享一个统计代码块耗时的小工具

    相信很多人都遇到这样一个问题? 加班加点,上线了一个功能,但接口的响应时间有点长? 如何定位排查? 普通研发人员一般会采用下面方式,在很多位置点埋入开始时间戳.结束时间戳,相减便得到耗时.代码如下: ...

  4. R语言统计代码运行耗时实战:计算代码运行时间、使用proc.time函数计算代码运行时间

    R语言统计代码运行耗时实战:计算代码运行时间.使用proc.time函数计算代码运行时间 目录

  5. unity 代码执行耗时_您可以使用代码自动执行6项耗时的任务

    unity 代码执行耗时 扫盲曾经是抄写员和牧师的领域. 然后,世界变得更加复杂,要求每个人都读写. 计算也是一种读写能力,但是仅让程序员的教士才能理解它对于我们这个复杂的在线世界而言还不够. &qu ...

  6. jsp中java代码无效_来杯咖啡,教你如何优雅的在java中统计代码块耗时

    推荐阅读: Sping源码+Redis+Nginx+MySQL等七篇实战技术文档,阿里大佬推荐 阿里内部:2020年全技术栈文档+PPT分享,(万粉总结,回馈粉丝) 在我们的实际开发中,多多少少会遇到 ...

  7. 如何优雅的在java中统计代码块耗时

    在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况,我们一般的写法如下 long start = System.currentTimeMillis(); try {// .... 具体的代 ...

  8. java打印代码执行耗时

    在代码开发中,常常需要看代码的执行效率,必须直观的看到某个循环消耗的多少时间,进而针对性的优化,有两种方式. 1.使用System.currentTimeMillis()方法 打印代码开始的执行时间和 ...

  9. iOS OC 计算代码执行耗时

    CFAbsoluteTimeGetCurrent()函数能够以毫秒为单位计算当前时间与2001.1.1差值. CFAbsoluteTime start = CFAbsoluteTimeGetCurre ...

最新文章

  1. 字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
  2. python如何循环使用input_python基础知识input到while循环
  3. python数组类型_一文搞懂Python中的所有数组数据类型
  4. python 源代码 macd双底 高 低_MACD指标DIFF双底与双顶:买入与卖出
  5. java如何排除多余的依赖_Maven依赖排除 禁止依赖传递 取消依赖的方法 去除jar包中的不想要的依赖关系...
  6. navicat工具查看MySQL数据库_表占用容量_占用空间是多少MB---Linux工作笔记048
  7. 单选框加了css后显示不出来,layui radio 单选框 效果 显示不来 解决方法
  8. 工作缺点和不足及措施_个人总结缺点和不足
  9. python字符串后面添加字符串_Python字符串中添加、插入特定字符的方法
  10. SQL语句的内外左右连接
  11. C++Singleton模式
  12. 多态的理解(父类引用指向子类对象)
  13. python 波动率锥_期权波动率期限结构与日历价差策略
  14. ps4饥荒联机版服务器未响应,《饥荒联机版》国服的正确打开方式,你get到吗?...
  15. 【数字化】推动5大层面变革——BCG和MIT帮你设计卓越数字化组织
  16. Google原生机pixel 刷机Root
  17. JupyterLab 常用配置
  18. 《六人行》难懂笑话分集详解
  19. java的jama包_JAVA 矩阵工具包 JAMA
  20. 赤兔ctcms2.0.9最新破解授权版|修复bug|采集入库规则自定义...

热门文章

  1. 最新表情包小程序+前后端去授权版/最火表情包小程序源码
  2. Charles服务器代理使用
  3. python综合程序设计——做一个可视化大屏
  4. php正则替空行,正则匹配空行实例
  5. 三年前,故事这样开始 三年后,故事这样延续---2015年终总结
  6. 自学MBA,我推荐你看这本《MBA必读12篇》
  7. QPBOC——数据认证
  8. 使用BitLocker实现磁盘加密、u盘加密、移动硬盘加密
  9. c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...
  10. 拉格朗日乘子和KTT条件