分析C++性能分析工具&生成火焰图

C++ Perf性能调优+火焰图调优 通过本文介绍应该对PERF有了基本的认识,还有很多方法来查看软件的热点函数,如GPERF、GPROF等,你可以自己深入去研究,本文希望能够起到抛砖引玉的作用。 阅读详情

gperftools是Google提供的一套工具,其中的一个功能是CPU profiler,用于分析程序性能,找到程序的性能瓶颈。
Graphviz是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形,gperftools依靠此工具生成图形分析结果。
安装命令:yum install graphviz
编译google-perftools
因为我们只需要tcmalloc功能,因此不编译google-perftools中的其他工具。
wget http://gperftools.googlecode.com/files/google-perftools-1.9.1.tar.gz
tar -xvzf google-perftools-1.9.1.tar.gz
cd google-perftools-1.9.1
./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --enable-minimal–disable-dependency-tracking
make
makeinstall
/sbin/ldconfig
用法
1.目标程序中引入头文件<google/profiler.h>,链接libprofiler库,64位操作系统同时链接libunwind库,在需要分析代码的起点和终点调用ProfilerStart()函数和ProfilerStop()函数
2.编译链接,运行程序
分析输出
pprof脚本用于分析profile文件并输出结果,包括文本和图形两种输出风格。
例如:demo是目标程序,my.prof是profile文件
生成文本风格结果:pprof --text ./demo my.prof >profile.txt
生成图形风格结果:pprof --pdf ./demo my.prof > profile.pdf
对于一个函数的CPU使用时间分析,分为两个部分:
1.整个函数消耗的CPU时间,包括函数内部其他函数调用所消耗的CPU时间
2.不包含内部其他函数调用所消耗的CPU时间(内联函数除外)

示例:

#include <google/profiler.h>
#include <iostream>
using namespace std;
void func1() {
   int i = 0;
   while (i < 100000) {
       ++i;
   }  
}
void func2() {
   int i = 0;
   while (i < 200000) {
       ++i;
   }  
}
void func3() {
   for (int i = 0; i < 1000; ++i) {
       func1();
       func2();
   }  
}
int main(){
   ProfilerStart("my.prof"); // 指定所生成的profile文件名
   func3();
   ProfilerStop(); // 结束profiling
   return 0;
}

然后编译链接运行,使用pprof生成分析结果
g+±o demo demo.cpp -lprofiler
运行demo,生成my.prof文件,然后用pprof命令对该文件解析,生成结果txt或pdf等。
pprof–text ./demo my.prof > output.txt
pprof–pdf ./demo my.prof > output.pdf

pdf格式的比较直观
这里写图片描述
图形风格的结果由节点和有向边组成,
每个节点代表一个函数,节点数据格式:
Class Name
Method Name
local (percentage)
of cumulative (percentage)
local时间是函数直接执行的指令所消耗的CPU时间(包括内联函数)。性能分析通过抽样方法完成,默认是1秒100个样本,一个样本是10毫秒,即时间单位是10毫秒;cumulative时间是local时间与其他函数调用的总和;如果cumulative时间与local时间相同,则不打印cumulative时间项。
有向边:调用者指向被调用者,有向边上的时间表示被调用者所消耗的CPU时间

如果生成pdf时报错:ps2pdf command not found,那么要安装Ghostscript。
下载地址:
http://www.linuxfromscratch.org/blfs/view/cvs/pst/gs.html
百度地址:
http://pan.baidu.com/s/1hsP2N56#list/path=%2F
安装的时间会很长,要耐心等待。

文本风格输出结果
Total: 116 samples
83 71.6% 71.6% 83 71.6% func2
33 28.4% 100.0% 33 28.4% func1
0 0.0% 100.0% 116 100.0% __libc_start_main
0 0.0% 100.0% 116 100.0% _start
0 0.0% 100.0% 116 100.0% func3
0 0.0% 100.0% 116 100.0% main
一共6列,分别代表的意思是:
分析样本数量(不包含其他函数调用)
分析样本百分比(不包含其他函数调用)
目前为止的分析样本百分比(不包含其他函数调用)
分析样本数量(包含其他函数调用)
分析样本百分比(包含其他函数调用)
函数名

注意:

gperftools需要程序正常退出才能向prof文件打印数据,所以当程序无法退出时,得要发送信号给进程,在接到信号后,调用ProfilerStop();函数,才能打印出数据。如下所示:

void signal_handler(int signo)
{
    signal(signo, signal_handler);
    INFO_LOG("recv signal[%d]", signo);
    switch(signo)
    {      
        case SIGTERM:
             //程序自己退出,或shell里调用kill缺省该进程。该信号可以被阻塞,或被处理
             //可以在这里做一些程序退出前的最后处理工作
        	 ProfilerStop();
             INFO_LOG("Process recieve SIGTERM");
             break;      
    }
    exit(0);
}
//主函数
signal(SIGTERM, &signal_handler);

用valgrind的callgrind工具也可以进行分析程序性能。
分享一个教程:http://www.tuicool.com/articles/nUZJBb2

perf&FlameGraph生成火焰图

yum在线安装perf

sudo yum install perf

离线安装perf

perf 工具下载
https://cdn.kernel.org/pub/linux/kernel/tools/perf/v5.9.0/perf-5.9.0.tar.gz

tar -xvf perf-5.9.0.tar.gz 
cd perf-5.9.0
cd tools/perf/
make
sudo cp perf /usr/local/bin

检查

$ /usr/local/bin/perf --version
perf version 5.9.gbbf5c979011

安装 FlameGraph:从 GitHub 下载 FlameGraph 工具集:

git clone https://github.com/brendangregg/FlameGraph.git

编译C++程序

使用 g++ 编译代码并添加 -g 选项以生成调试信息:

g++ -g -o example example.cpp

使用 perf 进行性能分析

用perf启动程序
运行 perf 记录程序的性能数据:

perf record -g ./example

其中 -g 选项用于记录函数调用图信息。
运行结束后,生成perf.data文件。

生成火焰图所需的文本文件

使用 perf script 将 perf 记录的数据转换为文本格式:

perf script > perf.unfold

生成perf.unfold文件。

生成火焰图

进入 FlameGraph 目录,将文本文件折叠并生成火焰图:

cd FlameGraph
./stackcollapse-perf.pl ../perf.unfold > perf.folded
./flamegraph.pl perf.folded > flamegraph.svg

查看火焰图

使用浏览器打开生成的 flamegraph.svg 文件即可查看。

对某个运行进程进行分析

假设我们要对pid为3309的进程进行性能分析

perf record -F 99 -p 3309 -g -- sleep 20

生成perf.unfold文件

perf script -i perf.data &> perf.unfold

生成火焰图

./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
./FlameGraph/flamegraph.pl perf.folded > perf.svg
C++性能分析-perf火焰图 C++使用perf火焰图分析性能 阅读详情

相关推荐

记一次Arthas火焰图(Flame Graph)性能分析实战

前言 最近负责的一个核心服务,TP999总是被上游吐槽,失败率也比较高。TP999达到了200ms+,最终通过arhas的火焰图,定位到了耗时的原因,是由于对象多余的序列化和反序列化导致的,去掉后性能提示了30%。本文将会顺带介绍一下火焰图的使用。 ...

暴雪的博客 1万+

C++代码使用 gperftools 工具进行性能分析

一直想用gperftools做一下性能方面的尝试,之前一直忙着开发,目前已经到了后期,忙里抽闲亲自操作一遍,从安装到分析做个简单的记录,以便后续拿来直接用...

AlbertS Home of Technology 1831

C++:perf详解 + Flame Graph火焰图分析程序性能

因为项目需求,C++和java同时在搞,最近了解到Flame Graph火焰图这个工具,网上查了查资料,这里记录一下。 1 介绍 web site http://www.brendangregg.com/flamegraphs.html git: https://github.com/brendangregg/FlameGraph 火焰图是一个可视化工具,可以将诸多性能检测相...

zzhongcy的专栏 1万+

Linux性能分析工具 - perf 和火焰图

linux 性能分析工具 perf 和火焰图

qazw9600的专栏 5801

利用perf 进行性能分析、火焰图--【C/C++程序】的性能分析、监控

性能调优工具如 perf,Oprofile 等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文。性能分析原理:perf对运行中的进程按一定频率进行中断采样,获取当前执行的函数名及调用栈,如果大部分的采样点都落在同一个函数上,则表明该函数执行的时间较长或该函数被频繁调用,可能存在性能问题。CPU性能分析:Perf可以监测程序的CPU使用情况,包括每个函数的执行时间和调用次数,帮助找出CPU密集型程序的性能瓶颈。

roshy的专栏 1427

火焰图性能分析

火焰图性能分析

C/C++ 787

端侧内存分析工具

端侧内存分析工具

伪君子 592

性能分析利器——最简单的利用火焰图教程C&Java

c语言下面火焰图绘制 perf record -p 60175 -g -o perf.data perf script -i perf.data | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl &gt; flameGraph.svg perf record -p 14975 -g -- sleep 30 perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/fla.

u013970710的博客 2066

ubuntu18使用google-perftools并生成火焰图

ubuntu18使用google-perftools并生成火焰图

Flying_Motor的博客 1834

C++笔记之linux环境perf生成火焰图

— 2024-04-01 中午。

小勇博客 3182

(源码)基于C++的性能分析与火焰图生成工具.zip

# 基于C++的性能分析与火焰图生成工具 ## 项目简介 本项目是一个基于C++的性能分析工具,主要用于生成火焰图(Flame Graph),帮助开发者分析程序的性能瓶颈。通过加载库的方式调用性能检测函数,用户仅需对JSON文件进行配置,即可自定义采样率、采样周期、文件保存路径等参数。生成的火焰图以SVG格式保存,直观展示程序的性能问题。同时,运行信息会实时记录在数据库中,方便后续查询和分析。 ## 项目的主要特性和功能 多类型性能检测支持oncpu、offcpu和diff三种类型的性能检测,分别用于分析CPU运行、IO等待和性能差异。 自定义配置通过JSON文件配置采样率、采样周期、输出路径等参数,灵活适应不同需求。 实时数据记录运行信息实时记录在数据库中,便于后续查询和分析。 火焰图生成生成SVG格式的火焰图,直观展示程序的性能瓶颈。 跨平台支持支持多种操作系统和架构,确保工具的广泛适用性。 ## 安装使用步骤

Linux下用火焰图进行性能分析

优快云 GitHub Linux下用火焰图进行性能分析 LDD-LinuxDeviceDrivers/study/debug/tools/perf/flame_graph 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调

OSKernelLAB(gatieme) 6万+

C/C++面试八股文汇总

以对象管理资源,利用的就是C++构造的对象最终会被对象的析构函数销毁的原则。上述的的申请、使用、释放资源的程序较为简单,但是如果程序很复杂的时候,需要为所有的new 分配的内存delete掉,导致极度臃肿,效率下降,更可怕的是,程序的可理解性和可维护性明显降低了,当操作增多时,处理资源释放的代码就会越来越多,越来越乱。栈在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。

wzzrh的博客 1万+

JVM性能分析工具——Arthas及火焰图的使用

Arthas的使用及Apache Bench的使用

qq_46073180的博客 3658

单片机入门说明书:从本质到架构,一文看透MCU核心原理

其实你每天用的洗衣机、刷的智能门锁、开的汽车里,都藏着它的身影。相当于工厂里的“运输轨道”,CPU算出的结果通过总线送到RAM存储,ROM里的程序通过总线传给CPU执行,外设的信号通过总线交给CPU处理,整个过程每秒能重复上百万次,确保各模块协同高效。高端单片机(比如STM32F4系列)还会配备DMA(直接存储器访问)单元,相当于“专用传送带”——不需要CPU干预,就能直接让外设和RAM之间传输数据(比如让ADC采集的温度数据直接存进RAM),大大降低CPU负担,让CPU能专注处理更重要的任务。

IAMIF12的博客 1038

Cursor使用教程,有点难

Cursor Code Editor 不仅仅是一个代码编辑器,它更是一个集成了 AI 的全功能开发环境,帮助你从代码编写到优化的整个过程变得更加智能和高效。它通过内置的 AI 代码补全、错误检测和自动修复功能,大大减少了手动编写代码的负担,帮助你快速完成开发任务。同时,Cursor 还与多种前沿的 AI 大模型集成,包括 OpenAI 的 GPT-4o、Claude 3.5 和 Meta 的 Llama 3.1。

xiaofeitunAI的博客 1万+

C++分析程序各模块耗时-perf火焰图

perf 是一个非常实用且深入的性能分析工具,适用于从底层硬件交互到上层应用程序逻辑的全方位性能剖析。perf 工具的设计目的是为了帮助开发者和系统管理员分析应用程序以及内核本身的性能,寻找潜在的性能瓶颈,并据此进行针对性的优化。

泠山的博客 3682

电源新手别怕!手把手教你搞定Buck电路的环路补偿(附Type II/III补偿器参数计算)

本文为电源设计新手详细解析Buck电路环路补偿技术,重点介绍Type II和Type III补偿器的参数计算与设计方法。通过实例演示和实用技巧,帮助工程师快速掌握环路补偿原理,解决电源振荡、响应慢等问题,提升电路稳定性与性能。

weixin_30607029的博客 616

C++ 之 perf+火焰图分析与调试

perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件perf list主要是用于列出有哪些可用的event,可以供来分析。,其中可以列出 hard ware 的event, sw 是software的event, 其它类似。

shiwei0813的博客 1286

ESP32S3 Korvo2V3四通道AEC配置实战:基于AFE的回声消除优化

本文详细介绍了在ESP32S3 Korvo2V3平台上配置四通道AEC(回声消除)的实战经验。通过AFE算法优化和硬件连接调试,实现高质量回声消除,显著提升智能音箱和会议设备的语音交互体验。重点解析了四通道配置、数据格式对齐和参数调优等关键技术要点。

elastic6hunter的博客 932

UG\NX二次开发 获取对象的引用集

获取对象的引用集,一个对象可能有多个引用集,下面这个封装函数可以获取对象的所有引用集。

王牌飞行员_里海的博客 489

C++ 有哪些性能分析工具?

2026年C++性能分析工具全景摘要 当前主流C++性能分析工具分为采样型、插桩型、内存专用等类别。Linux首选轻量级perf+Hotspot组合,Windows推荐VS Profiler,游戏开发适用Tracy。内存分析使用Valgrind/Heaptrack,硬件优化选择VTune,GPU开发必备Nsight。90%场景下perf+Tracy即可解决,火焰图工具如FlameGraph是标配。建议根据平台(Linux/Windows)和优化目标(CPU/内存/GPU)选择工具链,Linux可快速使用pe

m0_57545130的博客 1339

华为OD机考真题 新系统 - 数列求值(Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【数列求值】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数列求值】多语言题解。

qq_45776114的博客 661

性能分析工具:perf火焰图

性能分析工具:perf火焰图 1.安装 perf: yum install -y perf 2.https://github.com/brendangregg/FlameGraph 拉取脚本 1.采样 perf record -C $cpu_num -e cpu-clock -o perf.data -g sleep 10 -C 指定cpu -e cpu-clock 指perf record监控的指标为cpu周期 -o perf.data 信息收集文件名 -g 支持记录函数的调用关系 2.用perf sc

vegeta852的博客 580

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 九度:斐波那契数列
下一篇: strace命令
okiwilldoit
博客等级 码龄17年 86粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值