3

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

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

你通常是怎么做的?你能推荐任何更好的替代品吗?

PD 哪些是开源解决方案(最好适用于 Linux 或 Mac OS)X?

4

6 回答 6

1

OProfile on Linux works fairly well, actually i like it better than GProf. There are a couple graphical tools that help visualize OProfile output.

于 2010-03-16T23:17:53.340 回答
0

请参阅SD C++ 探查器

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

于 2010-03-13T17:49:14.903 回答
0

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

  • 分析器更改应用程序的组装指令(称为检测)并记录每个细节。这些分析器往往很慢(应用程序运行速度慢约 10 倍),有时难以设置,而且通常不是免费的,但它们为您提供了与性能相关的最佳信息。如果您需要这种类型的分析器,请查找“Ration Quantity”、“AQTime”和“Performance Validator”。
  • 探查器不检测应用程序,而只是查看正在运行的应用程序并收集它的“样本”。这些分析器速度很快(没有性能损失),通常易于设置,并且您可以找到相当多的免费替代品。如果您想要这种类型的分析器,请查找“非常困”和“卢克·斯塔克沃克”。

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

因此,我切换到了免费的替代品,此时我主要使用“非常困”。

于 2010-03-13T17:55:01.510 回答
0

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

于 2010-03-13T17:56:25.623 回答
0

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

于 2010-03-13T18:19:28.917 回答
0

与---相同的答案

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

我一直听到这个——“我想知道我的程序把时间花在了哪里”。
让我建议另一种措辞 - “我想找出我的程序为什么会花费时间”。

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

我一直听到另一个神话——你需要测量方法的执行时间,以找到“慢”的方法。有很多方法可以让程序花费比他们需要的更多的时间,例如,在某些方法中进行线性搜索而不是二分搜索,这可能是人们想到的那种事情。

思考它的方法是这样的:

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

So as a way to see what the program is doing, from a time perspective, here's how many people do it.

于 2010-03-13T19:12:52.847 回答