我尝试在ubuntu上使用gprof测试我的cpp代码。
但我发现了一些错误。
当gprof计算执行时间时,最小时间单位为0.01秒。
例如,如果我的程序中我的函数的执行时间是0.001或甚至更快,gprof识别为0秒。
即使我执行我的功能一千次,它计算如下:0 / s + 0 / s .... + 0 / s = 0 / s
但实际运行时间是1秒......
所以,我想知道如何修改最小时间单位或计算确切的执行时间。
请帮我 :)
我不需要任何其他分析工具的建议
这个问题几乎与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对此事的引用:
所以你的选择是:
- 更改操作系统中的profil()函数。
- 编写自己的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不适合你。