gprof 中计算的时间是不是包括未分析的函数所花费的时间?

Posted

技术标签:

【中文标题】gprof 中计算的时间是不是包括未分析的函数所花费的时间?【英文标题】:Would the time counted in gprof include what is spent in functions that are not profiled?gprof 中计算的时间是否包括未分析的函数所花费的时间? 【发布时间】:2012-08-27 16:21:11 【问题描述】:

我现在有一个项目,我想对其进行分析,但它使用了另一个我无法控制的库。说如果有这样的功能:

#include <library.h>
void function(...)

    // do something
    for (...)
    
        // ...
        library_function(...);
        // ...
    
    // do something

让我们假设 library_function 来自另一个未在启用分析的情况下编译的静态库。现在,如果 gprof 告诉我运行 function 需要 10 秒,包括它的所有孩子,这是否包括在 library_function 中花费的时间?

【问题讨论】:

【参考方案1】:

不,因为gprof 的工作方式,它对程序计数器进行采样,确定程序计数器在哪个函数中,并为该函数增加自身时间。

此外,它还计算任何函数 A 调用任何函数 B 的次数。

据此,它会尝试解决其他所有问题。

当然,这只适用于它知道的函数。

很聪明,不过you can do better

已添加:由于有人明智地决定删除上述帖子,这里简要总结一下如何做得更好:

Try this instead.Here's an example of a 44x speedup.Here's a 730x speedup.Here's an explanation of the statistics.Here's an answer to critiques.Here's an 8-minute video demonstration.

【讨论】:

非常感谢您的澄清。但不幸的是,我正在开发一个 NDK 库。我还没有找到解决办法。 @fefe:没有可以运行代码的调试器吗?如果您可以通过 Ctrl-C 或其他方式打断它,这就是您所需要的。 我试过了,我相信它应该很有用。但是我的调试器现在遇到了一些问题,现在无法进入(或在断点处停止)本机代码。所以我唯一得到的是我的图书馆花了很多时间,但不完全是在哪里。但这超出了这个问题的范围。 @fefe:这并不总是容易做到的。有一次我不得不使用硬件在线仿真器,并破译十六进制存储器。这并不容易,但没有其他办法,而且确实奏效了。 @wojciii:我编辑了答案。它可能比您想阅读或观看的要多,但我不得不努力反对对此的意见潮流,即“测量,测量”和“使用分析器”。这些只是演讲厅和博客到博客的回声。有很多人理解这一点——我只是最直言不讳的。对于真正认真的性能调整,简单的手动方法是迄今为止最有效的方法,这些链接给出了充分的理由。

以上是关于gprof 中计算的时间是不是包括未分析的函数所花费的时间?的主要内容,如果未能解决你的问题,请参考以下文章

GNU profiler(gprof)使用

GNU profiler(gprof)使用

如何从 gprof 中排除某个函数?

性能测试工具GNU gprof

无法使用 gprof 累积时间 - gnu 分析器

在 bash 脚本中执行时未生成 gprof 输出