8

私の理解では、デフォルトで gprof は CPU 時間を考慮に入れています。実時間に基づいてプロファイルする方法はありますか?

私のプログラムは多くのディスク I/O を行うため、使用する CPU 時間は実際の実行時間のほんの一部にすぎません。ディスク I/O のどの部分が最も時間を消費しているかを知る必要があります。

4

5 に答える 5

3

google-perftoolsのプロファイラーを使用して実時間を測定できます。グーグルプロファイラーを壁掛けモードに切り替えるには、環境変数CPUPROFILE_REALTIME=1を設定します。

于 2012-02-09T06:08:05.890 に答える
1

gprofはこれを行いません。これを見てください。

この。

簡単に言うと、 gdbの下で実行し、Ctrl-BreakまたはCtrl-Cをランダムに10回実行して、呼び出しスタックを表示します。I / Oが(たとえば)60%の時間を費やしている場合、(おおよそ)10回の一時停止のうち6回で、writebufまたはreadbufルーチンに表示され、I/Oを要求するコード行がスタックに明確に表示されます。

lsstackを使用して同じ情報を取得することもできます。

于 2010-05-10T18:06:34.623 に答える
1

strace または cachegrind を使用して、コードを適切にプロファイリングできます。strace はシステム コールに費やされた時間の詳細を提供し、cachegrind はリソース使用率の詳細な分析を提供します。

于 2010-06-15T11:31:10.160 に答える
0

-finstrument-functionsこれは、gcc コンパイラのオプションを使用して行うことができます。これにより、任意の関数のエントリ/終了ポイントで呼び出されるカスタム関数が取得されます。関数コールバック (__cyg_profile_func_enterおよび__cyg_profile_func_exit) をいくつか提供するだけで済みます。

-finstrument-functions詳細については、gcc マニュアルでオプションを検索してください。

Balau の技術ブログには、これがどのように機能するかのエンド ツー エンドの概要/例を提供する優れた投稿もあります: Trace and profile function calls with GCC

于 2015-03-06T13:40:28.413 に答える
0

gprof を変更して壁時計のプロファイリングを行うのは非常に簡単です。置換するのは次の 8 文字のみです。

ITIMER_PROF -> ITIMER_REAL

SIGPROF -> SIGALRM

ファイルglibc/sysdeps/posix/profil.c、 関数、および__profilへの呼び出しの近く(より正確にはand )setitimersigaction__Setitimer__sigaction

変更後、SIGALRM を使用するすべてのプログラムは壊れ、ブロッキング syscall 再起動コードを持たないプログラムは、間違った結果をもたらす可能性があります。

また、glibc バイナリの int 値を直接変更することもできます (システム全体libc.soでこれを行わないでください。別のコピーを作成し、LD_LIBRARY_PATH を使用してプログラムに渡してください)。

バイナリ パッチの場合、ITIMER_PROF は 2 です。ITIMER_REAL は 0 です。SIGPROF は 27 (0x1b) です。SIGALRM は 14 (0x0e) です。profilglibc の関数では、各定数に対して 2 つの場所があります。

もう 1 つの方法は、実行時に setitimer および sigaction 関数の引数を変更する ptrace-debugger を作成することです。

于 2011-05-12T14:44:43.363 に答える