我在我的可执行文件上运行 gprof,但可执行文件花费大量时间wait()
来完成子进程。等待时间是否计入 gprof 时间?
问问题
481 次
3 回答
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
如果您真的想分析孩子/线程,我建议您以此为起点。
于 2009-12-28T17:39:57.150 回答
1
gprof只计算进程中的实际 CPU 时间。更好的方法是对调用堆栈进行采样,并在挂钟时间而不是 CPU 时间对其进行采样。当然,在等待用户输入时不应采集样本(或者如果采集了样本,则应将其丢弃)。一些分析器可以完成所有这些工作,例如 RotateRight/Zoom,或者您可以使用pstack或lsstack,但这里有一个简单的方法来做到这一点。
于 2010-02-19T15:14:35.100 回答