我想了解给我的 C++ 程序是如何工作的,以及它在哪里花费的时间最多。
为此,我尝试先使用gprof
然后gprof2dot
获取图片,但结果有时有点难看。
你通常是怎么做的?你能推荐任何更好的替代品吗?
PD 哪些是开源解决方案(最好适用于 Linux 或 Mac OS)X?
我想了解给我的 C++ 程序是如何工作的,以及它在哪里花费的时间最多。
为此,我尝试先使用gprof
然后gprof2dot
获取图片,但结果有时有点难看。
你通常是怎么做的?你能推荐任何更好的替代品吗?
PD 哪些是开源解决方案(最好适用于 Linux 或 Mac OS)X?
OProfile on Linux works fairly well, actually i like it better than GProf. There are a couple graphical tools that help visualize OProfile output.
请参阅SD C++ 探查器。
这里的其他答案表明面向探针的分析器具有很高的开销(10 倍)。这个没有。
在我看来,有两种选择(在 Windows 上):
虽然我过去使用过 Rational Quantity 和 AQTime 等商业分析器,并且对结果非常满意,但我发现缺点(难以设置、无法解释的崩溃、性能缓慢)超过了优点。
因此,我切换到了免费的替代品,此时我主要使用“非常困”。
如果您想查看应用程序的结构(谁调用了什么、引用、调用树等),请查看“了解 C/C++”。此应用程序会调查您的源代码,并允许您从应用程序的结构中查询几乎所有内容。
您可以尝试KCachegrind。这是一个可视化由Valgrind工具获取的样本的程序,称为 Callgrind。KCachegrind 似乎没有得到积极维护,但他生成的图表非常有用。
编辑:@Steve 建议我给出一个不那么简洁的答案。
我一直听到这个——“我想知道我的程序把时间花在了哪里”。
让我建议另一种措辞 - “我想找出我的程序为什么会花费时间”。
或许区别并不明显。当程序执行一条指令时,它这样做的原因被编码在程序的整个状态中,包括调用堆栈。
只看程序计数器就像试图通过分析车轮的旋转角度来判断是否需要乘坐出租车。
您需要查看程序的整个状态。
我一直听到另一个神话——你需要测量方法的执行时间,以找到“慢”的方法。有很多方法可以让程序花费比他们需要的更多的时间,例如,在某些方法中进行线性搜索而不是二分搜索,这可能是人们想到的那种事情。
思考它的方法是这样的:
So as a way to see what the program is doing, from a time perspective, here's how many people do it.