【问题标题】:Gprof: specific function time [duplicate]Gprof:具体功能时间[重复]
【发布时间】:2014-01-31 01:31:44
【问题描述】:

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

gprof -F FunctionName  Executable gmon.out>log 

【问题讨论】:

  • 我只会使用gprof(不带-F 参数)并查看log 的内部。正如你所问(正如我所解释的)elsewhere 可能没有足够准确的答案来回答“获得特定功能的时间”
  • 你为什么不直接循环它 10^6 次,然后计算需要多少秒。如果循环需要 N 秒,这意味着该函数需要 N 微秒。如果要计算纳秒,请循环 10^9 次。这种方法根本不会减慢速度,而且应该非常准确。 (我不明白你为什么要打扰gprof。)
  • @MikeDunlavey 我还利用了 C++ 中存在的时间函数 (stackoverflow.com/questions/21060574/function-execution-time),但是每次我使用链接中提到的任何时间函数运行程序时,它都会给出不同的结果。
  • @Zara:但是你运行了很多次吗?如果这样做,差异将平均为更可靠的数字。不要期望每次运行都具有与其他每次运行相同的运行时间。变量太多了。
  • @Zara:首先,在将每个程序和tune the daylights out of it 进行比较之前,将其与另一个程序进行比较。除非您这样做,否则 2 倍的速度差异可能完全没有意义,因为任何给定的程序,在您编写它时,通常都有大量的水要挤出。

标签: c++ linux profiling gprof


【解决方案1】:

你几乎是在重复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)) (例如,每 10 毫秒)来自使用 setitimer(2)TIMER_PROF 设置的计时器;所以程序计数器会定期采样。阅读gprof 上的维基页面,并注意分析可能显着降低运行时间。

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

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

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

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

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

还要考虑当前的superscalar 处理器具有如此复杂的micro-architectureinstruction pipelinecachesbranch predictorregister renamingspeculative executionout-of-order execution 等短函数未定义。你无法预测或衡量它。

【讨论】:

  • 因为我之前使用了clock_gettime,所以每次运行代码时都会发生这种情况,我为该函数获得不同的时间。我要取几个值然后取平均值吗?
  • 其次,在 gprof 中,该函数显示 0 秒,因为我的程序中的一个函数占用了 99% 的时间。那么,我是否将我的函数置于 10000 或更多的循环中,然后将结果除以该数字?
  • 您应该放弃精确可靠准确的目标,和不打扰它,你的功能。您想要做的事情可能绝对不可能,甚至可能毫无意义(因为缓存效果)。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 2013-02-19
  • 2015-07-08
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多