如何使用一些分析信息获取程序的调用图 我想了解一个C++程序是如何工作的,它花费的时间最多。p>

如何使用一些分析信息获取程序的调用图 我想了解一个C++程序是如何工作的,它花费的时间最多。p>,c++,profiling,gprof,call-graph,C++,Profiling,Gprof,Call Graph,为此,我尝试先使用gprof,然后使用gprof2dot来获取图片,但结果有时有点难看 你通常是怎么做的?你能推荐更好的选择吗 p.D.哪些是开源解决方案(最好是Linux或Mac OS)X?请参阅 这里的其他答案表明,面向探针的探查器具有很高的开销(10倍)。这一个没有。在我看来,有两种选择(在Windows上): 分析器,用于更改应用程序的汇编指令(称为检测)并记录每个细节。这些分析器往往速度较慢(应用程序运行速度大约慢10倍),有时很难设置,而且通常不是免费的,但它们提供了与性能相关的最

为此,我尝试先使用
gprof
,然后使用
gprof2dot
来获取图片,但结果有时有点难看

你通常是怎么做的?你能推荐更好的选择吗

p.D.哪些是开源解决方案(最好是Linux或Mac OS)X?

请参阅


这里的其他答案表明,面向探针的探查器具有很高的开销(10倍)。这一个没有。

在我看来,有两种选择(在Windows上):

  • 分析器,用于更改应用程序的汇编指令(称为检测)并记录每个细节。这些分析器往往速度较慢(应用程序运行速度大约慢10倍),有时很难设置,而且通常不是免费的,但它们提供了与性能相关的最佳信息。如果您想要这种类型的档案器,请查找“定量”、“AQTime”和“性能验证器”
  • 分析器,它不检测应用程序,只查看正在运行的应用程序并收集其“样本”。这些分析器速度快(没有性能损失),通常易于设置,并且您可以找到许多免费的替代方案。如果你想要这种类型的剖析器,可以找“非常困倦”和“卢克·斯塔克沃克”
虽然我在过去使用了Rational Quantity和AQTime等商业分析器,并且对结果非常满意,但我发现缺点(难以设置、无法解释的崩溃、性能缓慢)超过了优点


因此,我选择了免费的替代方案,目前我主要使用的是“非常困倦”。

如果您想查看应用程序的结构(谁调用什么、引用、调用树等等),请查看“了解C/C++”。此应用程序调查您的源代码,并允许您查询应用程序结构中的几乎所有内容。

您可以尝试。这是一个程序,它可以可视化通过Callgrind工具获取的样本。KCachegrind似乎没有积极维护,但他生成的图形非常有用。

编辑:@Steve建议我给出一个不那么简洁的答案

我经常听到这样的话——“我想知道我的程序在哪里花时间。”
让我建议另一种说法——“我想找出我的程序花费时间的原因”

也许差别并不明显。 当程序执行指令时,它执行指令的原因将在程序的整个状态中进行编码,包括调用堆栈。
仅查看程序计数器就像试图通过分析车轮的旋转角度来确定是否需要乘坐出租车一样。
您需要查看整个程序的状态

我一直听到另一个神话——你需要测量方法的执行时间,找到“慢”的方法。 有很多方法可以让程序花费比需要更多的时间,比如说,在某些方法中,用线性搜索代替二进制搜索,这可能是人们心目中的想法

思考这个问题的方式是:

  • 没有一件事比必要的花费更多的时间。可能有几个
  • 每一件需要时间的事情都会占一小部分,比如10%,50%,90%或者类似的数字。这意味着如果挂钟可以在这段时间内停止,那么整个应用程序所需的时间就会少很多
  • 你想知道这些东西是什么,不管它们是什么。探查器(采样器)通过采集大量浅层样本(PC或调用堆栈)并汇总它们来获得测量值。但是测量不是你需要的。你需要的是从时间的角度了解它在做什么。最好是获得少量样本,比如10或20个,然后检查(而不是总结)它们。如果某个活动占用了20%、50%或90%的时间,那么这就是你在每个样本上捕捉到它的概率,因此这大约是你将看到它的样本的百分比。重要的是找出它是什么,而不是对不相关的东西进行准确的测量

因此,从时间的角度来看程序正在做什么。

Linux上的OProfile工作得相当好,实际上我更喜欢它而不是GProf。有两个图形工具可以帮助可视化OProfile输出。

您能澄清一下“丑陋”是什么意思吗?你是反对有效的内容还是仅仅是布局?布局,我遵循第一个例子。信息是可以的,但是它的显示方式不是很好;我的意思是,我得到一张尺寸为20(宽)x2(高)的图片。它不能用在报告中如果你想要一个报告,为什么你要画一个图表?我想在报告中添加一些数字,其中一些数字包含在调用图中。我想这并不是很奇怪,我指的是开源应用程序,那么在使用kcachegrind之前,你能给出一个链接,说明如何从valgrind获取调用图信息吗?Thanksry类似于
valgrind­tool=callgrind
。有一些选项可以调整您的结果,常用的选项包括
…dump-instr=yes­trace-jump=yes
。然后开始
kcachegrind
阅读统计数据并享受乐趣:-)。嗯