什么是适用于Linux的易于使用的C++分析器?

82

我需要对在Linux下运行的C++代码进行性能分析。你们能推荐一些性能分析工具吗?


1
你应该添加Linux和C++标签。这样你可能会得到更好的回复和意见范围。 - Duck
2
看起来是 https://dev59.com/n3RC5IYBdhLWcg3wOOL1 的重复。 - Michael Myers
likwid,LLTng,oprofile,valgrind,vtune,gprof,perf,gperftools,pTop - Shan
请查看Slant上的这个问题:https://www.slant.co/improve/topics/1005 - ideasman42
9个回答

39

使用gprof。

只需使用-pg标志进行编译(我认为(但不确定)您必须关闭优化),然后使用gprof分析可执行文件生成的gmon.out文件。

例如:

gcc -pg -o whatever whatever.c

./whatever

gprof whatever gmon.out

使用 g++ 和 cpp 也是同样的事情。


33
优化前的代码进行性能剖析有点毫无意义,不是吗?同样地,对经过-pg大量修改的代码进行性能剖析往往会让你错误地优化了错误的位置。 - federal
1
-pg 是一个链接器选项,而不是编译器。 - Slug Pue

25

Valgrind 是一个着名的 Linux 分析工具。


我认为Valgrind更适合检查内存泄漏。我正在尝试查看哪些函数被调用了等等。 - shergill
14
使用名为“callgrind”的套件工具。 - dfa
2
Valgrind仅是一个构建动态工具的框架。虽然它已经成为Memcheck的代名词,Memcheck是基于Valgrind构建的工具。Callgrind是一个相当不错的分析器。 - Falaina
http://valgrind.org/docs/manual/cl-manual.html - xaxxon

13

我一直在使用来自RotateRight(http://www.rotateright.com)的Zoom。它具有函数的蝴蝶视图,您可以双击任何函数以深入源代码或汇编代码。请使用调试信息(-g)构建以查看您的源代码,但您仍应该构建和优化优化的代码。


1
刚试用了这个程序,感觉真的很好!目前在Linux上是我最喜欢的性能分析工具;但是值得一提的是,它要求代码在编译时必须使用 -fno-omit-frame-pointer 才能有效地进行性能分析。 - Nik Reiman
1
这个链接似乎失效了,有人知道它在哪里(或者是否可以在其他地方找到)吗? - Simon F

13

我是Oprofile的粉丝。它需要安装内核模块,学习曲线有点陡峭,但非常强大,对于优化程序/没有调试符号的程序非常有效。

Vtune是由英特尔制作的另一个非常强大的分析器。我相信Linux版本适用于非商业软件免费。

还有Valgrind工具套件,由dfa提出。Callgrind可能是你最感兴趣的。Cachegrind(其功能集是Callgrind的子集)和Massif也很有趣,但我没有使用后者的经验。


1
+1 对于 OProfile 来说,那可不是一个“易用的工具”。 - dfa
1
哈哈,说得对。我可能不应该让它听起来那么简单 :) 它肯定不像使用 Vtune 和 Valgrind 工具那样简单,但我觉得你很快就会习惯的。 - Falaina
oprofile看起来很有趣 - 它支持x86_64吗? - LiraNuna
VTune不幸的是没有免费使用。 - rustyx

5

Google还有一个漂亮的分析器,作为google-perftools的一部分--这些工具包已经包含在Debian/Ubuntu和可能其他发行版中。


5

2
请看一下 Sysprof。你的发行版很可能已经有了它。
请注意,所有提到的分析器在应用程序编译时最好启用框架指针。也就是说,在gcc命令行上使用-fno-omit-frame-pointer。

2

gprof是用于性能分析的标准GNU工具。


0

你只会根据手动收集的10个样本来判断瓶颈,而不是由'prof'收集的1000个样本。 - Dmitry Grigoryev
1
@DmitryGrigoryev:没错,这实际上告诉你应该修复什么。统计解释在这里。事实上,人们犯的第一个错误是认为他们正在寻找“瓶颈”,而不是完全良好但浪费的代码;-) - Mike Dunlavey
好文章,谢谢。我完全认同你的观点,即在调试器中看到实际函数调用时,优化要容易得多。我也明白“瓶颈”并不意味着“良好的优化目标”,只是一个潜在的目标。尽管如此,我仍然认为从prof开始是有意义的:如果我发现f()在统计上是最棘手的函数,我会多次停止程序,直到我最终进入f(),而不是随机选择第一个停止的函数。 - Dmitry Grigoryev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接