必备条件:
免费用于非商业用途
与
gcc
(g++
)编译程序一起使用< br可以使用x86-64
程序。使用优化启用功能编译的配置文件程序(
-O3
)。 (*请参见脚注)即使启用了优化,也可以显示真实的(已取消组合的)符号名称。 (*请参见脚注)
有用的功能:
易于使用的基本配置文件(检测
hot
代码)行粒度(行中的行函数很热门)
组装说明粒度
很好的功能:
GUI(即使是第3方)
容易安装
未来的需求(我现在不需要,但是不久以后会需要):
配置多线程程序
与
clang
配合使用(会很好)例如,在Windows上,Visual Studio Profiler很好。
我在Linux上尝试了
gprof
,但是即使启用了-g -pg
也无法使其启用优化。(*)可能需要存在调试和性能分析信息(例如
-p -g -pg
)。#1 楼
我使用valgrind插件/工具callgrind对程序进行了概要分析。对我来说,当在x86_64下使用
-O3
添加调试符号时,在-g
上优化后可以正常工作。 Valgrind已获得GPL许可。 callgrind手册指出,可以使用kcachegrind或Eclipse Linux Tools可视化输出结果,该声明指出,如果在源中正确注释了fork,它可以进行程序集分析和处理。
易于使用:
valgrind --tool=callgrind ./path/to/executable
它运行程序的速度比正常运行慢,并创建文件
callgrind.out.$pid
,其中$pid
是程序的pid调用(这是在callgrind输出==$pid==
的每一行中显示的数字)。 然后可以在kcachegrind中使用
kcachegrind callgrind.out.$pid
对其进行可视化
评论
可惜callgrind太慢了... gprof / sprof呢?
– Aleksei Petrenko
16 Mar 17 '16 at 14:02
#2 楼
您至少应该了解随机暂停技术。它不能满足您的所有要求,但它比任何自动分析器在查找所谓的“热”代码时更有效,称为“提速的机会”。
更有效的原因是这个。
想象一个理想的探查器。
假设它是随机抽样的程序的状态(包括所有线程的堆栈和内存)。
它具有人工智能和自动编程功能,因此它可以理解程序以及编写该程序的人。
假设它检查了每个程序采样并确定花费时间的全部原因,并正在寻找一种可能的方式来避免花费时间,方法可能是更改某些内容。
如果它看到了这样的加速机会,并在分数X上看到了其中的样本,它可能建议您进行更改,最多可以节省时间的X倍。
那不是出色的分析器?
它可以找到各种各样的东西,而不仅仅是功能花费很多时间而您无能为力。
值得一问的是-它会采样多少个样本
通常的假设是-越多越好-精度越高。
错误!您要查找问题,而不是解决问题。
如果加速机会花费X倍的时间,它将花费10,000个样本的X分数,大约花费10个样本的分数X。
因此,如果它足够大以至于值得修复,那么它就不需要很多样本。
实际上,只需要两次查看一个问题就可以知道它的重要性。
平均而言,它需要2 / X个样本,所以如果X为0.3,则需要6.67个样本。
(统计上的证明在这里。)
好吧,如果您不介意使用自己的头部,并手动采集一些样本,例如使用
jstack
或调试器,您已经拥有了理想的分析器。许多程序员都知道这一点,并用它来使他们的代码快速地运行。
评论
这不是软件推荐问题的答案
–user416
2015年4月24日14:34在
@JanDoggen:建议使用任何IDE或编译器发行版附带的调试器。那不是软件吗?我知道很难质疑要进行概要分析需要使用探查器工具的前提,但是如果不能对此前提提出质疑,则会导致找不到较大的加速因素。恕我直言,程序员之所以喜欢探查器,是因为他们有确认偏差。换句话说,他们喜欢听到没有办法加快他们的代码的速度-本质上来说这是最佳的,即使那可能不是真的。
–迈克·邓拉维(Mike Dunlavey)
15年4月24日在16:12
#3 楼
Allinea MAP可以匹配列表中的所有内容-它也可以处理线程的“未来需求”。没有其他类似的东西了-它的开销非常低-通常<5%,而callgrind远远超过100%。它是商业性的-但出于完整答案的考虑,这里属于
。 />
评论
我支持您的回答,但是出于完整性考虑,我不得不提到最便宜的许可证价格为635英镑(950美元)
–莫格说要恢复莫妮卡
15年3月11日在8:21
评论
我忘记了O3,但是perf_events,Oprofile和Valgrind(+ callgrind)可能是最好的候选人。stackoverflow.com/questions/375913 / ...