Gprof:具体的功能时间

时间:2014-01-12 06:46:36

标签: c++ linux profiling gprof

我想知道我的程序中特定函数花费的时间。对于这个目的,我正在使用gprof。我使用以下命令来获取特定函数的时间,但日志文件仍显示程序中存在的所有函数的结果。请帮助我。

gprof -F FunctionName  Executable gmon.out>log 

1 个答案:

答案 0 :(得分:3)

你几乎要重复another question about function execution time

当我回答there时,有一个困难(由于硬件!)来可靠地获得某个特定功能的执行时间,特别是如果该功能需要很少的时间(例如,小于一毫秒)。您的原始问题指向these methods

我建议将clock_gettime(2)CLOCK_REALTIMECLOCK_THREAD_CPUTIME_ID

一起使用

gprof(1)(使用-pg进行编译后)与profil(3)一起使用,并使用采样技术,基于发送SIGPROF信号(从signal(7)TIMER_PROF设置的定时器中定期(例如每10毫秒)看setitimer(2)};所以程序计数器定期采样。阅读gprof上的wikipage,注意分析可能会显着降低运行时间。

如果您的函数在短时间内(小于一毫秒)执行,则分析会给出不精确的测量值(请参阅heisenbugs)。

换句话说,分析和测量短期运行功能的时间正在改变程序的行为(这也会发生在其他一些操作系统上!)。您可能必须放弃目标,准确 >不打扰它。它甚至可能不会产生任何精确的感,例如因为CPU cache

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

BTW,特定功能的精确时间可能并不重要。重要的是整个应用程序的benchmarking

您还可以要求编译器优化您的程序;如果你正在使用link time optimization,即编译并将g++ -flto -O2连接起来,那么小函数的时序概念甚至可能不复存在(因为编译器和链接器可能有在你不知道的情况下内联它。

还要考虑当前的superscalar处理器有micro-architecture instruction pipelinecachesbranch predictorregister renaming,{{3}这么复杂},speculative execution等等,定时短函数的概念是未定义的。你无法预测或衡量它。