文章目录

  • 0. 前言
  • 1. gprof
  • 3. valgrind
  • 4. gperftools
  • 5. perf

0. 前言

  • 目标:性能分析(profile)包含的内容特别多,但目前我只关注运行时间。

  • 详细要求:最终也没找到合适的(需要每个函数的平均运行时间),看来还是需要手写记录。

  • 参考资料

    • PPT - C/C++调试、跟踪及性能分析工具综述:介绍了一些常用性能分析工具。
    • How can I profile C++ code running on Linux?:很多很好的回答,建议把高赞的都看一遍,特别是这个回答,非常值得一看。
    • 一般Linux性能调优都用什么工具?
    • Linux性能分析工具与图形化方法
  • 工具小节(个人水平不够,非常主观)

名称 功能 优点 缺点
gprof 获取每个函数的调用次数以及运行时间 无需安装,GUN自带;使用方便 不适用于多线程程序以及function pointers;可视化工具一般;软件本身好像不是用来做性能分析的
valgrind 除了查看,还有很多其他工具(内存泄漏啥的) 功能全;可视化工具完善 运行速度特别慢(比普通程序慢10倍很正常);由于功能太多,学习成本较高
gperftools 查找程序运行热点(不能知道单个函数单次运行时间,而是获得每个函数运行时间占整体的百分比) 使用方便,对程序整体速度影响小 功能单一(其他的都好像能做别的事情);可视化工具一般
perf 类似 gperftools,不过针对的是整体Linux内核;功能强大 内核工具,不仅可用来分析单个程序,还可用来分析整机性能;可视化工具很好看;功能完善 函数名有很多 Unknown,当前函数感觉函数名看不懂……
VTune Intel CPU性能测试工具 大家都说好,没用过,我也不知道好在哪里 付费软件(这一条就打败了所有)

1. gprof

  • 资料:

    • Stack Overflow: Alternatives to gprof
    • gprof manual
  • 无需安装

  • 使用流程

    • 编译时需要添加选项 -pg

      • 如果要编译cuda代码,对 nvcc 也需要添加该选项
      • 如果使用了第三方库,第三方库的编译没有使用该选项,则不会进行性能分析。
    • 成功编译并运行程序,程序结束后会得到本地文件 gmon.out
    • 文本结果生成命令 gprof -b /path/to/execute gmon.out > report.txt
    • 图像生成
      • 先要安装 gprof2graph,可以直接 pip3 install gprof2graph,也可以用apt安装
      • gprof /path/to/execute | gprof2dot -n0 -e0 | dot -Tpng -o output.png
  • 文本结果含义(参考这里)

  • 缺陷:问题其实很多,可以参考这里和这里

    • 不能用于多线程或function pointers
    • 不能监控没有使用 -pg 选项的库(比如项目引入的第三方库)
    • 不可用于实时监控(都是程序运行完一起分析)

3. valgrind

  • 基本概念

    • valgrind 本质就是一个虚拟机,能在上面跑很多应用(tool)
    • 性能测试只是 valgrind 的其中一个应用,即 callgrind。
    • 可用于实时监控
  • 参考资料

    • 最推荐官方文档
    • 网上找了很多,质量普遍非常低,而且感觉都是从1-2篇文章复制粘贴的
  • 安装:直接 apt 即可,sudo apt install kcachegrind valgrind

  • 使用:

    • 编译期间没有其他操作
    • 在运行程序时需要添加命令,如 valgrind --tool=callgrind ./execute,生成的文件形如 callgrind.out.pid
    • 通过 kcachegrind 进行可视化:kcachegrind callgrind.out.pid
  • tips

    • 可手动选择 Profile 的起止时间,参考这里。

      • 首先启动程序(应该没有开始 profile):valgrind --tool=callgrind --dump-instr=yes -v --instr-atstart=no ./binary > tmp
      • 手动启动 profile:callgrind_control -i on
      • 手动结束 profile:callgrind_control -k
      • 将buffer中的profile内容保存到本地文件中:callgrind_control -d
    • 多线程程序需要添加可选项 valgrind --tool=callgrind --separate-threads=yes ./execute
  • 可视化工具概述

    • 资料也没找到太有用的,还是看官方文档吧
    • 常见单词含义(参考这里):
      • Incl.:用来说明时间,也就是该函数运行时间占整个程序的比例
      • Self:用来说明时间,与 Incl. 的区别在于,Self 不包含当前函数调用其他子函数的时间。
      • Called:函数调用次数。
    • 也可以用 grpof2graph gprof2dot -f callgrind -n10 -s callgrind.out.31113 | dot -Tpng -o valgrind.png
  • 缺陷

    • 程序会慢很多,10倍慢小场面,参考这里

4. gperftools

  • 参考资料:

    • 官方文档
    • 性能测试工具CPU profiler(gperftools)的使用心得
  • 安装:可以通过源码,也可以通过 sudo apt install google-perftools

    • 源码安装如下
# libunwind, gperftools need this
# wget https://github.com/libunwind/libunwind/releases/download/v1.3.1/libunwind-1.3.1.tar.gz
tar zxvf 1.3.1.tar.gz
cd libunwind-1.3.1
./autogen.sh
./configure
make
sudo make install
cd ..# gperftools, google performance tools
# wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.7/gperftools-2.7.zip
tar zxvf gperftools-2.7.tar.gz
cd gperftools-gperftools-2.7
./autogen.sh
./configure
make
sudo make install
cd ..
  • 使用

    • 在编译的时候添加 -lprofiler

      • 由于一些细节(lib导入了,但源码中没有调用,那就会忽略)问题,所以建议添加的参数是 -Wl,--no-as-needed,-lprofiler,--as-needed
    • 在运行程序前设置环境变量 CPUPROFILE=/path/to/profile.file 设置profile结果的保存路径,然后运行程序即可,形如 CPUPROFILE=/tmp/profile ./myprogram
    • 通过 pprof 获取结果:
      • 可视化结果:pprof ./test_capture test_capture.prof --pdf > prof.pdf
      • 文本结果:./test_capture test_capture.prof --text > prof.txt
  • 还有一种使用方式,就是修改源代码
#include <gperftools/profiler.h>
....
int main(int argc, const char* argv[])
{ProfilerStart("test_capture.prof");.....ProfilerStop();
}
  • 文本文件每一列信息解析
1. Number of profiling samples in this function
2. Percentage of profiling samples in this function
3. Percentage of profiling samples in the functions printed so far
4. Number of profiling samples in this function and its callees
5. Percentage of profiling samples in this function and its callees
6. Function name

5. perf

  • 参考资料

    • 有很多不错的参考资料,但都是在研究 perf 的实现细节,而我只关心使用……
    • wiki
    • 在Linux下做性能分析3:perf
    • 性能分析工具Linux perf的介绍与使用
  • 安装:sudo apt install linux-tools,可能根据内核版本不同,有一些别的东西要安装,根据提示就好。

  • 使用:

    • 编译阶段没有其他操作。

    • 程序运行时,使用 perf record 命令采集性能数据,例如 perf record -o perf_with_stack.data ./main

      • 结果默认保存在 perf.data 中,也可以通过 -o 选项指定。
      • 也可实现对进程进行性能分析,如 perf record -F 99 -p 13204 -g -- sleep 30
        • -F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒
    • 可使用 FlameGraph 可视化结果 sudo perf script -i perf_with_stack.data | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > flamegraph.svg

    • 可通过 perf report 获取文本结果,例如 perf report -i perf.data

  • perf record 参数介绍

-e record指定PMU事件--filter  event事件过滤器
-a  录取所有CPU的事件
-p  录取指定pid进程的事件
-o  指定录取保存数据的文件名
-g  使能函数调用图功能
-C 录取指定CPU的事件
  • 缺陷:函数名称好像不是特别好,有一些unknown。毕竟是系统级的。

C++ 性能分析工具调研相关推荐

  1. 正确使用 Android 性能分析工具——TraceView

    前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看不懂T ...

  2. php性能分析工具 - xhprof的安装使用

    一.前言 有用的东西还是记录下来吧,也方便以后的查询:这次记录一下xhprof的安装使用: xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低, ...

  3. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  4. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  5. 系统级性能分析工具perf的介绍与使用

    测试环境:Ubuntu16.04 + Kernel:4.4.0-31 apt-get install linux-source cd /usr/src/tools/perf make &&am ...

  6. Linux常用性能分析工具汇总

    文章目录 性能分析工具 top pstree mpstat vmstat pidstat perf proc tcpdump bcc工具箱 cachestat cachetop memleak fil ...

  7. Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  8. 性能分析工具 Android TraceView

    1. TraceView 简介 Traceview是android平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到每个方法的执行时间 Tracev ...

  9. 11 个 Visual Studio 代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

最新文章

  1. YOLO-v4目标检测实时手机端实现
  2. 网络营销第三课:利用织梦搭建动态网站(2)
  3. java自定义日志级别_自定义log4j日志级别
  4. CLOSE_WAIT状态的原因与解决方法 --转
  5. SpringSecurity权限管理介绍
  6. cass生成曲线要素文件_几种常见的CASS字体异常问题,教你如何解决
  7. 快手通过标签添加的我_快手内容运营技巧:快手创作者如何蹭热点?快速上热门...
  8. ArcSDE的版本管理机制
  9. 【iOS取证篇】iOS设备去除备份密码提取数据
  10. 行走在思想的边上――武墩支教十二月(上)
  11. R 语言中1 和1L的区别
  12. Python(21):下载模块命令-pip
  13. 如何给word文档加水印
  14. Python---项目3-破解使用crypt方法加密(已加salt参数)的登录密码
  15. 笔记本电脑总是莫名其妙自动睡眠,记录一次排查过程
  16. 聊聊阿伦·艾佛森这个人
  17. 邮件接收中Postfix、Dovecot、Squirrelmail、MySQL、AMaVis、Clam AntiVirus和SpamAssasin的功能解析
  18. 判断字符串中的字母大小写、数字
  19. 攻防世界——robots
  20. 微信8.0,初心改不改?

热门文章

  1. 【JZOJ4807】破解
  2. 一个JAVA程序员成长之路(转载)
  3. 2023年Python、Golang、Java、C++如何选择?
  4. 前端路由 与 后端路由
  5. vscode 取消拉去变基_git大礼包:学完出师
  6. html js 延迟加载,JS延迟加载方法
  7. C语言字符付应整数值,全国二级C语言复习资料3.doc
  8. C#仿QQ皮肤_写作说明
  9. Docker-1.12 swarm模式
  10. Tyk在Ubuntu上安装