<分区>
我想找出程序中某个特定函数所花费的时间。为此,我正在使用 gprof。我使用以下命令获取特定功能的时间,但日志文件仍然显示程序中所有功能的结果。请在这方面帮助我。
gprof -F FunctionName Executable gmon.out>log
<分区>
我想找出程序中某个特定函数所花费的时间。为此,我正在使用 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-architecture与 instruction pipeline , caches , branch predictor , register renaming , speculative execution , out-of-order execution等等等等,为短函数计时的概念是未定义的。您无法预测或衡量它。
关于c++ - gprof:具体函数时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072058/