如何使用一些分析信息获取程序的调用图

时间:2010-03-13 17:27:40

标签: c++ profiling gprof call-graph

我想了解一个给我的C ++程序是如何工作的,以及它花费最多的时间。

为此,我尝试使用第一个gprof然后gprof2dot来获取图片,但结果有时很难看。

你通常如何做到这一点?你能推荐更好的替代品吗?

Pd积。哪些是开源解决方案(最好是Linux或Mac OS)X?

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

请参阅SD C++ Profiler

此处的其他答案表明,面向探针的分析器具有较高的开销(10x)。这个没有。

答案 2 :(得分:0)

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

  • 可更改应用程序的装配说明(称为仪器)并记录每个细节的配置文件。这些分析器往往很慢(应用程序运行速度慢约10倍),有时很难设置,而且往往不是免费的,但它们可以为您提供最佳的性能相关信息。如果您想要这种类型的分析器,请查找“Ration Quantity”,“AQTime”和“Performance Validator”。
  • 不检测应用程序的分析器,只是查看正在运行的应用程序并收集它的“样本”。这些分析器很快(没有性能损失),通常很容易设置,你可以找到一些免费的替代品。如果你想要这种类型的探查器,请寻找“非常困”和“Luke Stackwalker”。

虽然我过去使用过Rational Quantity和AQTime这样的商业分析器,并且对结果非常满意,但我发现缺点(难以设置,无法解释的崩溃,性能缓慢)超过了优势。

因此我改用免费替代品,此时我主要使用“非常困”。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

Same answer as ---

编辑:@Steve建议我给出一个不太精辟的答案。

我一直听到这个消息 - “我想找出 我的程序花费时间的地方”。
让我建议另一种措辞 - “我想找出 为什么 我的程序花费时间”。

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

我总是听到另一个神话 - 你需要测量方法的执行时间,找到“慢”的方法。 程序有很多方法比他们需要花费更多的时间,比如通过线性搜索而不是某种方法中的二元搜索,这可能是人们想到的事情。

考虑它的方法是:

  • 不只是一个的东西花费的时间超过了必要的时间。可能有几个。
  • 每个花时间的东西都需要一些分数,比如10%,50%,90%或一些这样的数字。这意味着如果在此期间可以停止挂钟,那么整个应用程序可以花费多少时间。
  • 你想知道那些东西是什么,它们是什么。 Profilers(采样器)通过采集大量浅层样本(PC或调用堆栈)并对其进行汇总来进行测量。但测量不是你需要的。从时间的角度来看,你需要找到它正在做什么。最好是获得少量样本,例如10或20,并且检查(不总结)它们。如果某些活动需要20%,50%或90%的时间,那么您将在每个样本的行为中捕获它的概率,因此大致是您将看到它的样本的百分比。重要的是找出它是什么,而不是准确测量不相关的东西。

从时间角度来看,here's how many people do it是一种了解该计划正在做什么的方法。