2

我在我的可执行文件上运行 gprof,但可执行文件花费大量时间wait()来完成子进程。等待时间是否计入 gprof 时间?

4

3 回答 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

似乎有一个记录分叉进程的选项,这篇 ibm 文章谈到了一点。

同一篇文章建议尝试tprof,它在使用上与 gprof 类似,但在底层使用了不同的方法,这可能会为多进程/多线程应用程序提供更准确的图片。

于 2009-12-28T18:05:19.137 回答
1

gprof只计算进程中的实际 CPU 时间。更好的方法是对调用堆栈进行采样,并在挂钟时间而不是 CPU 时间对其进行采样。当然,在等待用户输入时不应采集样本(或者如果采集了样本,则应将其丢弃)。一些分析器可以完成所有这些工作,例如 RotateRight/Zoom,或者您可以使用pstacklsstack但这里有一个简单的方法来做到这一点

于 2010-02-19T15:14:35.100 回答