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

GPROF profiling tool is inaccurate execution time

本文关键字:不准确 执行时间 工具 GPROF      更新时间:2023-10-16

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

但是我发现了一些错误。

GPROF计算执行时间时,最小时间单元为0.01秒。

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

即使我执行函数千次,它也会像这样计算:0/s 0/s…。 0/s = 0/s

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

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

请帮助我:)

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

这个问题几乎是Gprof输出中不准确的重复性,但是有一个较小的区别:看起来它试图在错误的位置找到性能瓶颈:

即使我执行了我的函数千次,也这样计算: 0/s 0/s…。 0/s = 0/s

这不是Gprof的工作方式。GPROF在t中进行样品计数器一次(通常为0.01秒)。它不仅概括了时间测量,还依赖于统计数据。从绝不会从应获得的大约100个样本中采样的程序的程序很少,因此很低。80个样本是可能的,可能是120个,0几乎是不可能的。因此,您的问题在其他地方。

gprof具有许多局限性,如GPROF输出中的不准确性所示。真正的问题是,要么花在I/O中,在共享库中具有复杂的相互递归,要么试图重用GPROF用来采样代码的相同信号。

如果您仍然坚持更改采样率,那么从理论上讲这似乎是可能的,但是它太复杂了,值得。有人声称重写profil()monstartup()功能。您可以使用LD_Preload等链接设施覆盖它们。鉴于Gprof的局限性,此路径不值得,我看不到任何实际上做到这一点的代码的引用。

这是尼克·克利夫顿(Nick Clifton)关于此事的一句话:

您的选择是:

  1. 更改OS中的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 ms。低于10ms的任何东西在内部增加到10ms。要克服此限制,请在Linux推荐的方式下阅读1MS分辨率计时器。

这是如此的嘲笑,我强烈建议您应该放弃这条路线并寻找其他探索器,或者找出为什么Gprof不适合您。