GPROF分析工具的执行时间不准确

问题描述 投票:0回答:1

我尝试在ubuntu上使用gprof测试我的cpp代码。

但我发现了一些错误。

当gprof计算执行时间时,最小时间单位为0.01秒。

例如,如果我的程序中我的函数的执行时间是0.001或甚至更快,gprof识别为0秒。

即使我执行我的功能一千次,它计算如下:0 / s + 0 / s .... + 0 / s = 0 / s

但实际运行时间是1秒......

所以,我想知道如何修改最小时间单位或计算确切的执行时间。

请帮我 :)

我不需要任何其他分析工具的建议

c++ profiling profiler execution-time gprof
1个回答
0
投票

这个问题几乎与inaccuracy in gprof output重复,但有一点不同:看起来它试图在错误的地方找到性能瓶颈:

即使我执行我的功能一千次,它计算如下:0 / s + 0 / s .... + 0 / s = 0 / s

这不是gprof的工作原理。 Gprof在T中对程序计数器进行一次采样(通常为0.01秒)。它不仅仅是总结时间测量,而是依赖于统计数据。如果一个程序需要1.00 CPU的机会从来没有采样到它应该得到的大约100个样本。 80个样本是可能的,120个是可能的,0几乎是不可能的。所以问题出在其他地方。

Gprof有很多限制,可以在inaccuracy in gprof output看到。真正的问题是时间花在I / O上,具有复杂的相互递归,在共享库中,或者它试图重用gprof用来对代码进行采样的相同信号。

如果你仍然坚持改变采样率,那么理论上似乎是可能的,但它太复杂而不值得。有have been claims重写profil()monstartup()功能。您可以使用LD_PRELOAD等链接器工具覆盖它们。鉴于gprof的局限性,这条路径不值得,而且我看不到任何实际代码的引用。

以下是Nick Clifton对此事的引用:

所以你的选择是:

  1. 更改操作系统中的profil()函数。
  2. 编写自己的monstartup()函数,并找到生成时间样本的其他方法。

我试图通过黑客攻击SIGPROF间隔来修改间隔:

void set_interval(double seconds)                                                                                                                                              
{                                                                                                                                                                              
      if (seconds <= 0)                                                                                                                                                          
          return;                                                                                                                                                                
      itimerval prev, next;                                                                                                                                                      
      next.it_value.tv_sec = (uint64_t) seconds;                                                                                                                                 

      next.it_value.tv_usec = (uint64_t)(1000000 * (seconds - next.it_value.tv_sec));                                                                                            
      next.it_interval = next.it_value;                                                                                                                                          
      setitimer(ITIMER_PROF, &next, &prev);                                                                                                                                      
}

在我试过的Linux上,来自main的set_interval(0.1)确实将时间间隔改为1/10秒(但在gprof输出中报告错误)。但是运行set_interval(0.001)对我的机器没有影响,因为最精细的粒度设置为10毫秒。低于10毫秒的任何内部都会增加到10毫秒。要克服此限制,请阅读1ms resolution timer under linux recommended way

这是如此嘲笑,我强烈建议你应该提供这条路线并寻找不同的探查器,或者找出为什么gprof不适合你。

© www.soinside.com 2019 - 2024. All rights reserved.