c++ - gprof:具体函数时间

标签 c++ linux profiling gprof

<分区>

我想找出程序中某个特定函数所花费的时间。为此,我正在使用 gprof。我使用以下命令获取特定功能的时间,但日志文件仍然显示程序中所有功能的结果。请在这方面帮助我。

gprof -F FunctionName  Executable gmon.out>log 

最佳答案

你几乎在重复another question about function execution time .

正如我回答的there ,很难(由于硬件!)可靠地获得某些特定函数的执行时间,特别是如果该函数花费的时间很少(例如少于一毫秒)。您原来的问题指向 these methods .

我建议使用 clock_gettime(2)使用 CLOCK_REALTIME 或者 CLOCK_THREAD_CPUTIME_ID

gprof(1) (在使用 -pg 编译后)适用于 profil(3)并使用采样技术,该技术基于从设置为 signal(7) 的计时器以周期性间隔(例如,每 10 毫秒)发送 SIGPROF 信号(参见 setitimer(2))和 TIMER_PROF;所以程序计数器会定期采样。阅读 gprof 上的维基页面并注意分析可能显着降低运行时间。

如果您的函数在短时间内(不到一毫秒)执行,则分析会给出不精确的测量值(阅读有关 heisenbugs 的信息)。

换句话说,分析和测量一个短时间运行函数的时间正在改变程序的行为(这也会发生在其他一些操作系统上!)。您可能不得不放弃精确可靠以及准确您的函数计时的目标不打扰它。它甚至可能没有任何精确意义,例如因为 CPU cache .

您可以使用不带任何 -F 参数的 gprof,如果需要,可以对文本配置文件输出进行后处理(例如使用 GNU awk )以提取您需要的信息想要。

顺便说一句,特定功能的精确计时可能并不重要。重要的是 benchmarking整个应用程序。

您还可以要求编译器进一步优化您的程序;如果您使用 link time optimization ,即用 g++ -flto -O2 编译 和链接 ,小函数的计时概念甚至可能不复存在(因为编译器和链接器可能已经内联了它在你不知道的情况下)。

还请考虑当前的 superscalar处理器如此复杂 micro-architectureinstruction pipeline , caches , branch predictor , register renaming , speculative execution , out-of-order execution等等等等,为短函数计时的概念是未定义的。您无法预测或衡量它。

关于c++ - gprof:具体函数时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072058/

相关文章:

读取文本文件的 C++ 类 - 出现错误

c - Notetaker 漏洞利用问题

c - 03优化后如何列出任意c程序使用的所有库函数

Linux 函数分析器输出

python - 分析使用多处理的 Python 代码?

c++ - 递归 Floodfill 段错误

c++ - 如何使主函数可以访问函数中的变量?

c++ - 是否有 GCC pragma 来覆盖某些代码段的调试信息 (-g) 的生成?

c++ - 写入文件和 mkdir 竞争条件 C

linux - 颠覆 1.6.6 错误 "Could not open the requested SVN filesystem"