我在我的可执行文件上运行gprof,但是可执行文件花了很多时间wait()
来完成子进程。等待的时间是否考虑了gprof时间?
答案 0 :(得分:1)
我没有多使用gprof,但据我所知,每个查看的wait
和子进程都没有被分析。
见一个简单的例子:
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
void slow_function()
{
unsigned int i;
for (i = 0; i < UINT_MAX; i++);
}
void quick_function(pid_t child)
{
int status;
waitpid(child, &status, 0);
return;
}
int main(int argc, const char *argv[])
{
pid_t child;
child = fork();
if (child == 0) // child process
{
slow_function();
exit(0);
}
else
quick_function(child);
return 0;
}
此gprof
输出(在我的机器上):
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 quick_function
如果你真的想要描述孩子/线程,我建议this作为起点。
答案 1 :(得分:1)
似乎有一个记录fork进程的选项,this ibm article稍微讨论它。
同一篇文章建议尝试tprof,它与使用中的gprof类似,但使用不同的方法,可以为多进程/多线程应用程序提供更准确的图片。
答案 2 :(得分:1)
gprof 仅计算流程中的实际CPU时间。更好的方法是对调用堆栈进行采样,并在挂钟时间内对其进行采样,而不是CPU时间。当然,在等待用户输入时不应采集样本(或者如果采用它们,则应丢弃它们)。有些分析器可以完成所有这些操作,例如RotateRight / Zoom,或者您可以使用 pstack 或 lsstack ,but here's a simple way to do it。