2

実行可能ファイルで gprof を実行していますが、実行可能ファイルはwait()子プロセスの完了に多くの時間を費やしています。待機に費やされた時間は、gprof のタイミングに考慮されていますか?

4

3 に答える 3

1

gprofは、プロセスの実際の CPU 時間のみをカウントします。はるかにうまく機能するのは、呼び出しスタックをサンプリングし、CPU 時間ではなく実時間でサンプリングするものです。もちろん、ユーザーの入力を待っている間はサンプルを取得すべきではありません (または、取得した場合は破棄する必要があります)。RotateRight/Zoom など、一部のプロファイラーはこれをすべて実行できます。また、 pstackまたはlsstackを使用することもできますが、簡単な方法を次に示します。

于 2010-02-19T15:14:35.100 に答える
1

フォークされたプロセスをログに記録するオプションがあるようです。この ibm の記事では、それについて少し説明しています。

同じ記事ではtprofを試すことを推奨しています。使用方法は gprof に似ていますが、内部では異なる方法を使用しているため、マルチプロセス/マルチスレッド アプリケーションのより正確な全体像が得られる可能性があります。

于 2009-12-28T18:05:19.137 に答える
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 に答える