gprof是否将花费的时间考虑在内?

时间:2009-12-28 13:55:48

标签: c gprof

我在我的可执行文件上运行gprof,但是可执行文件花了很多时间wait()来完成子进程。等待的时间是否考虑了gprof时间?

3 个答案:

答案 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