Linux C++ 开发9 - 手把手教你使用gprof性能分析工具

  • 1. 什么是gprof?
  • 2. gprof的用法
    • 2.1. 编译程序
    • 2.2. 运行程序
    • 2.3. 生成分析报告
    • 2.4. gprof常用参数说明
    • 2.5. 分析报告解读
      • 2.5.1. Flat profile 各个字段的含义
      • 2.5.2. Call graph 各个字段的含义
  • 3. Demo演示
    • 3.1. demo04.cpp 源码
    • 3.2. 编译、运行和分析
    • 3.3. 查看分析报告

1. 什么是gprof?

gprof 这是一个GNU的性能分析工具,它是GCC(GNU Compiler Collection,GNU编译器套件)的一部分,与GCC编译器紧密集成。可用于分析程序的函数调用关系和每个函数的运行时间。它通过在编译时插入性能分析代码来收集函数调用信息和执行时间,来帮助开发者识别性能瓶颈。

gprof的优点:

  • 可以方便的分析程序的函数调用关系和每个函数的运行时间。
  • gprof对于代码大部分是用户空间的CPU密集型的程序用处明显。

gprof的缺点:

  • 对于大部分时间运行在内核空间或者由于外部因素(例如操作系统的 I/O 子系统过载)而运行得非常慢的程序难以进行优化。
  • gprof默认不支持多线程程序。(gprof采用ITIMER_PROF信号,在多线程内只有主线程才能响应该信号)
  • 默认不支持共享库程序。

2. gprof的用法

2.1. 编译程序

首先,需要使用 -pg 选项编译你的程序:

g++ -pg -o my_program my_program.cpp

除了-pg外,还有一个参数-p,它可以生成适合prof性能分析工具的代码,他们之间的区别如下:

  • -p: 可以生成适合prof性能分析工具的代码。
  • -pg: 可以生成适合gprof性能分析工具的代码,也就是profile information for gprof的含义。

要理解上面描述,又不得不了解profgprof两个工具的关系了。

  • prof是一个较早的性能分析工具,最初在UNIX系统上使用。编译时加上-p选项,生成的可执行文件会在运行时收集性能分析数据。然后通过prof工具再生成性能分析报告。
  • gprof是GNU项目的一部分,是一个更现代的性能分析工具,它的功能与prof类似,但比prof提供了更多的功能和更好的用户体验。而且程序运行时输出的性能分析数据也更丰富、详细。现在gprof几乎取代了prof

2.2. 运行程序

编译完成后,运行你的程序:

./my_program

运行过程中,gprof 会生成一个名为 gmon.out 的文件,其中包含了性能分析数据。

2.3. 生成分析报告

运行完程序后,使用 gprof 工具生成分析报告:

gprof my_program gmon.out > analysis_report.txt

生成的 analysis_report.txt 文件中包含了函数的调用时间、调用次数等详细信息。

2.4. gprof常用参数说明

gprof命令格式:

gprof [options] [executable-file [profile-data-files…]] [> outputfile] Gprof命令行格式 Gprof command line format

options参数说明:

命令中文解释英文解释
-b简洁输出,不显示冗长的解释Brief output. Do not display verbose explanations
-s将多个gmon.out文件合并Summarize: merge several profile data files for cumulative stats
-p显示程序的每个函数的执行时间统计Display program’s functions execution time statistics
-q显示程序的每个函数的调用关系Display program’s

2.5. 分析报告解读

gprof 生成的报告通常包含以下几个部分:

  • Flat profile: 显示每个函数的执行时间、调用次数等信息。
  • Call graph: 显示函数之间的调用关系和每个函数的执行时间。
2.5.1. Flat profile 各个字段的含义
字段含义
% time该函数消耗时间占程序所有时间百分比
Cumulative seconds程序的累积执行时间(只是包括gprof能够监控到的函数)
Self Seconds该函数本身执行时间(所有被调用次数的合共时间)
Calls函数被调用次数
Self TS/call函数平均执行时间(不包括被调用时间,函数的单次执行时间)
Total TS/call函数平均执行时间(包括被调用时间,函数的单次执行时间)
name函数名
2.5.2. Call graph 各个字段的含义
字段含义
Index索引值
%time函数消耗时间占所有时间百分比
Self函数本身执行时间
Children执行子函数所用时间
Called被调用次数
Name函数名

3. Demo演示

3.1. demo04.cpp 源码

#include <iostream>int64_t add(int64_t a, int64_t b)
{return a + b;
}void func1()
{int sum = 0;for (int i = 0; i < 1000000; ++i){sum = add(sum, i);}std::cout << "Sum of 0 to 999999 is " << sum << std::endl;
}void func2()
{int sum = 0;for (int i = 0; i < 500000; ++i){sum = add(sum, i);}std::cout << "Sum of 0 to 499999 is " << sum << std::endl;
}int main()
{func1();func2();return 0;
}

3.2. 编译、运行和分析

# 编译程序
g++ -pg ./demo04.cpp -o ./demo04.out
# 运行程序
./demo04.out
# 生成分析报告
gprof ./demo04.out ./gmon.out > analysis_report04.txt
# 也可以使用下面的命令,生成的报告更加简洁,没有冗余信息
gprof -b ./demo04.out ./gmon.out > analysis_report04.txt

3.3. 查看分析报告

打开analysis_report04.txt,可以看到类似如下的输出:

Flat profile:Each sample counts as 0.01 seconds.no time accumulated%   cumulative   self              self     total           time   seconds   seconds    calls  Ts/call  Ts/call  name    0.00      0.00     0.00  1500000     0.00     0.00  add(long, long)0.00      0.00     0.00        1     0.00     0.00  func1()0.00      0.00     0.00        1     0.00     0.00  func2()...Call graph (explanation follows)granularity: each sample hit covers 4 byte(s) no time propagatedindex % time    self  children    called     name0.00    0.00  500000/1500000     func2() [10]0.00    0.00 1000000/1500000     func1() [9]
[8]      0.0    0.00    0.00 1500000         add(long, long) [8]
-----------------------------------------------0.00    0.00       1/1           main [6]
[9]      0.0    0.00    0.00       1         func1() [9]0.00    0.00 1000000/1500000     add(long, long) [8]
-----------------------------------------------0.00    0.00       1/1           main [6]
[10]     0.0    0.00    0.00       1         func2() [10]0.00    0.00  500000/1500000     add(long, long) [8]
-----------------------------------------------...Index by function name[8] add(long, long)         [9] func1()                [10] func2()

通过这些信息,可以清楚地看到 func1 和 func2 的执行时间和调用次数,从而进行针对性的优化。

历史文章推荐:

  • Linux C++ 开发10 - 手把手教你使用valgrind性能分析工具

  • Linux C++ 开发9 - 手把手教你使用gprof性能分析工具

  • Linux C++ 开发8 - 性能分析工具汇总

  • Linux C++ 开发7 - GDB常用命令汇总

  • Linux C++ 开发6 - GDB调试入门指南

  • Linux C++ 开发5 - 一文了解CMake构建

  • Linux C++ 开发4 - 入门makefile一篇文章就够了

  • Linux C++ 开发3 - 你写的Hello world经过哪些过程才被计算机理解和执行?

  • Linux C++ 开发2 - 编写、编译、执行第一个程序

  • VSCode系列2 - 如何用VSCode搭建C++高效开发环境?

  • Linux C++ 开发1 - 搭建C++开发环境


大家好,我是陌尘。

IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。

搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。

感谢大家的关注,期待与你一起成长。



【SunLogging】
扫码二维码,关注微信公众号,精彩内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148176.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

快速搭建Kubernetes集群

快速搭建Kubernetes集群 1 MacOS 1.1 下载 从 docker 下载 docker-desktop (opens new window)&#xff0c;并完成安装 1.2 启用 k8s 集群 启动 docker-desktop&#xff0c;打开preference 面板 切换到 Kubernetes 标签页&#xff0c;并勾选启动 Enable Kubernetes&#xff0c;…

个人防护装备检测系统源码分享

个人防护装备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

vcruntime140_1.dll无法继续执行代码的6种解决方法

在计算机编程和软件开发中&#xff0c;我们经常会遇到各种错误和问题。其中&#xff0c;vcruntime140_1.dll无法继续执行代码是一个常见的问题。这个问题可能会导致程序崩溃&#xff0c;影响我们的工作进度。因此&#xff0c;了解这个问题的原因以及如何解决它是非常重要的。 …

BOM【JavaScript】

BOM&#xff08;Browser Object Model&#xff09;是浏览器对象模型的缩写&#xff0c;它允许JavaScript与浏览器进行交互。BOM 提供了与浏览器窗口和框架相关的对象&#xff0c;使得开发者可以操作浏览器的各种功能。 BOM 的一些关键组成部分包括&#xff1a;window 对象表示…

文章结构元素分析系统源码分享

文章结构元素分析检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

【Joint Receiver Design for ISAC】Neyman person | Gaussian | MMSE estimator |

【1】统计信号处理 Neyman-Pearson criterion pp 425 【1】 R c E { g x ( n ) x ( n ) H g H } σ 2 I g g H σ 2 I , \mathbf{R}_c\mathbf{E}\{\mathbf{g}x(n)x(n)^H\mathbf{g}^H\}\sigma^2\mathbf{I}\mathbf{g}\mathbf{g}^H\sigma^2\mathbf{I}, Rc​E{gx(n)x(n)HgH}σ2…

Linux C# Day4

作业&#xff1a; 1.统计家目录下.c文件的个数 #!/bin/bash num0 for filename in ls ~/*.c do((num)) done echo $num2.定义一个稀疏数组(下标不连续)&#xff0c;写一个函数&#xff0c;求该稀疏数组的和&#xff0c;要求稀疏数组中的数值通过参数传递到函数中arr([2]9 [4…

【高中生讲机器学习】19. 各种经典聚类算法,一篇带你过完!(上)

创建时间&#xff1a;2024-09-11 首发时间&#xff1a;2024-09-23 最后编辑时间&#xff1a;2024-09-23 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名高一学生&#xff0c;热爱计…

Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook

文章目录 一 、计算属性1. 简写2. 完整写法 二、监视watch1. 监视【ref】定义的【基本类型】数据2. 监视【ref】定义的【对象类型】数据3. 监视【reactive】定义的【对象类型】数据4. 监视【ref】或【reactive】定义的【对象类型】数据中的某个属性5. 监视多个数据总结 三、wat…

Android下MVP和MVVM模式的实践

转载注明出处&#xff1a;https://blog.csdn.net/skysukai 1、前言 MVP和MVVM诞生已经好些年头了&#xff0c;记得刚毕业才参加工作的时候&#xff0c;第一次见到了有上万行的Activity&#xff0c;这种巨无霸的Activity维护起来简直就是噩梦。这时候&#xff0c;就需要进行代…

2024最新windows 11系统 PHP或者idea编译器-配置Git环境和使用教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 确保电脑上已安装到git,如下图所示&#xff1a;-是已安装好&#xff1a; 安装git教程&#xff1a; Git安装使用教程_git安装教程-CSDN博客 安装流程 点击左上角如图所示&#xff1a; 需要验证git本地 …

matlab恢复默认窗口布局

1.点击主页&#xff0c;选择布局 2.选择默认&#xff0c;即可恢复到默认的窗口布局

ollama 部署教程(window、linux)

目录 一、官网 二、安装方式一&#xff1a;window10版本下载 三、安装方式二&#xff1a;linux版本docker 四、 模型库 五、运行模型 六、API服务 七、python调用 ollama库调用 langchain调用 requests调用 aiohttp调用 八、模型添加方式 1.线上pull 2.导入 GGU…

类中的特殊内容

仿照string类&#xff0c;自己手动实现 My_string #include <iostream> #include <string.h> using namespace std;class My_string { private:int len;int size;char *ptr; public:My_string():size(15),len(0){ptrnew char[size];ptr[0]\0;}My_string(const char…

拓维思注册机Tovos PowerLine4.0.19树障分析 Tovos SmartPlan2.0.0航线规划软件

Tovos PowerLine是功能强大的输电线路智能巡检系统&#xff01;这是一个专业且智能的软件&#xff0c;能够更准确的进行巡检和对线路设备进行精确的测量&#xff0c;通过获取高精度的点云来获取精准的三维路线的地形地貌、设备设施、途径的各种物体等来精确您的三维空间信息和三…

【初阶数据结构】详解二叉树 - 树和二叉树(三)(递归的魅力时刻)

文章目录 前言1. 二叉树链式结构的意义2. 手搓一棵二叉树3. 二叉树的遍历&#xff08;重要&#xff09;3.1 遍历的规则3.2 先序遍历3.3 中序遍历3.4 后序遍历3.5 遍历的代码实现3.5.1 先序遍历代码实现3.5.2 中序遍历代码实现3.5.3 后序遍历代码实现 4. 统计二叉树结点的个数5.…

基于Vision-Board的智能应急环境监测控制小车

目录 1 项目概述 1.1 项目背景 1.2 系统功能介绍 1.2.1 下位机智能小车控制系统 1.2.2 微信小程序App 1.2.3 PC上位机App 1.3 框图介绍 1.3.1 主控板卡 1.3.2 小车控制模块 1.3.3 通信模块 1.4 系统使用的技术要点 2 系统硬件设计 2.1 Version board主控板块系统结…

《深度学习》卷积神经网络CNN 实现手写数字识别

目录 一、卷积神经网络CNN 1、什么是CNN 2、核心 3、构造 二、案例实现 1、下载训练集、测试集 代码实现如下&#xff1a; 2、展示部分图片 运行结果&#xff1a; 3、图片打包 运行结果&#xff1a; 4、判断当前使用的CPU还是GPU 5、定义卷积神经网络 运行结果&a…

通信工程学习:什么是NFVO网络功能虚拟化编排器

NFVO&#xff1a;网络功能虚拟化编排器 NFVO&#xff08;Network Functions Virtualization Orchestrator&#xff09;&#xff0c;即网络功能虚拟化编排器&#xff0c;是网络功能虚拟化&#xff08;NFV&#xff09;架构中的核心组件之一。NFV是一种将传统电信网络中的网络节点…

Linux学习笔记13---GPIO 中断实验

中断系统是一个处理器重要的组成部分&#xff0c;中断系统极大的提高了 CPU 的执行效率&#xff0c;本章会将 I.MX6U 的一个 IO 作为输入中断&#xff0c;借此来讲解如何对 I.MX6U 的中断系统进行编程。 GIC 控制器简介 1、GIC 控制器总览 I.MX6U(Cortex-A)的中断控制器…