GPROF分析工具是不准确的执行时间
GPROF profiling tool is inaccurate execution time
我尝试使用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)关于此事的一句话:
您的选择是:
- 更改OS中的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 ms。低于10ms的任何东西在内部增加到10ms。要克服此限制,请在Linux推荐的方式下阅读1MS分辨率计时器。
这是如此的嘲笑,我强烈建议您应该放弃这条路线并寻找其他探索器,或者找出为什么Gprof不适合您。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 程序不会执行函数 c++
- 简单C++"Hello World"程序的执行时间长
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- GDB 断点在 Mac 上是不准确的
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 为什么切换 for 循环的顺序会显著改变执行时间?
- cmd.exe与Powershell中C++程序的不同执行时间
- cout 打印不准确的结果,printf 打印准确的结果
- pthread执行时间比顺序执行时间差
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 为什么for循环中的异步不能提高执行时间
- clEnqueueWriteImage 在执行时间上不稳定
- CUDA 程序不测量执行时间:cuda事件记录
- 为什么我的执行时间不会写入文件?
- GPROF分析工具是不准确的执行时间
- C++和OpenMP——线程的执行时间大不相同
- 为什么我在分析器中得到的c++运行时间不准确
- 带和不带参数 C/C++ 的函数之间的执行时间