実行可能ファイルで gprof を実行していますが、実行可能ファイルはwait()
子プロセスの完了に多くの時間を費やしています。待機に費やされた時間は、gprof のタイミングに考慮されていますか?
3 に答える
gprofは、プロセスの実際の CPU 時間のみをカウントします。はるかにうまく機能するのは、呼び出しスタックをサンプリングし、CPU 時間ではなく実時間でサンプリングするものです。もちろん、ユーザーの入力を待っている間はサンプルを取得すべきではありません (または、取得した場合は破棄する必要があります)。RotateRight/Zoom など、一部のプロファイラーはこれをすべて実行できます。また、 pstackまたはlsstackを使用することもできますが、簡単な方法を次に示します。
フォークされたプロセスをログに記録するオプションがあるようです。この ibm の記事では、それについて少し説明しています。
同じ記事ではtprofを試すことを推奨しています。使用方法は gprof に似ていますが、内部では異なる方法を使用しているため、マルチプロセス/マルチスレッド アプリケーションのより正確な全体像が得られる可能性があります。
私は 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
実際に子/スレッドのプロファイルを作成したい場合は、これを出発点としてお勧めします。