c++ - 在存在激进内联的情况下分析 C++?

标签 c++ profiling

我正在尝试使用 gprof 找出我的 C++ 程序将时间花在哪里。这是我的困境:如果我使用与发布版本相同的优化设置进行编译,几乎所有内容都会被内联,而 gprof 毫无帮助地告诉我,我 90% 的时间都花在了核心例程中,所有内容都是内联的。另一方面,如果我在禁用内联的情况下编译,程序运行速度会慢一个数量级。

当我的程序在启用内联的情况下编译时,我想知道从我的核心例程调用的过程花费了多少时间。

我在四核 Intel 机器上运行 64 位 Ubuntu 9.04。我查看了 google-perftools,但这似乎不适用于 x86_64。不能在 32 位机器上运行。

是否有人对启用内联时如何更有效地分析我的应用程序有什么建议?

编辑:这是对我的问题的一些说明。如果最初不清楚,我深表歉意。

我想找出我的应用程序中花费的时间。分析我的优化构建导致 gprof 告诉我大约 90% 的时间花在 main 中,所有内容都内联。我在分析之前就知道了!

我想知道的是内联函数花费了多少时间,最好不要在我的构建选项中禁用优化或内联。在禁用内联进行分析时,应用程序会慢一个数量级。这种执行时间的差异是一个方便的问题,但我不相信禁用内联构建的程序的性能配置文件将与启用内联构建的程序的性能配置文件强烈对应。

简而言之:有没有办法在不禁用优化或内联的情况下获得有用 C++ 程序的分析信息

最佳答案

我假设您想要做的是找出哪些代码行花费了您足够的成本以值得优化。这与计时功能有很大不同。 You can do better than gprof.

Here's a fairly complete explanation of how to do it.

您可以手动完成,也可以使用可以提供相同信息的分析器之一,例如 oprofile , 和 RotateRight/Zoom .

顺便说一句,内联只有在被内联的例程很小并且本身不调用函数并且被调用的行在足够的时间内处于事件状态时才具有重要值(value)。

至于调试和发布构建之间的数量级性能比,可能是由于许多因素,可能是内联也可能不是。您可以使用 stackshot上面提到的方法来确定在这两种情况下发生了什么。我发现调试构建可能会因为其他原因而变慢,例如递归数据结构验证。

关于c++ - 在存在激进内联的情况下分析 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087870/

相关文章:

python - 获取python应用程序内存使用情况

c++ - QT如何设置QTreeWidget的行高?

c++ - BitBlt 忽略 CAPTUREBLT 并且似乎总是捕获目标的缓存拷贝

c++ - 如何在 pyMIC 中为 Xeon Phi 编译 knn

c++ - 无法在运行时加载动态共享库,包括 C++ 中的另一个共享库

java - 使用 byte buddy 或某些库进行分析

行为类似于 __COUNTER__ 宏的 C++ 结构

c# - Visual Studio 中是否有适用于 C# 的第三方分析工具?

java - JVM以编程方式获取堆中最大的对象

go - 如何使用 pprof 工具分析基准?