5

このプログラムの実行には2.34秒かかりますが、gprofによると1.18秒しかかかりません。他の場所で回答を読んだことがありますが、たとえばプログラムがI / Oバウンドの場合、gprofが間違っている可能性があることを示唆していますが、このプログラムは明らかにそうではありません。

これは、私がプロファイリングしようとしている便利なプログラムでも発生します。これは、この些細なテストケースに固有のものではありません。

(また、この場合、gprofは、main()がプログラムの実行時間の100%以上を占めると言っています。これはかなりばかげたバグですが、実際には問題を引き起こしません。)

$ cat test.c
int main() {
    int i;
    for (i=0;i<1000000000;i++);
}

$ gcc test.c -o test

$ time ./test

real    0m2.342s
user    0m2.340s
sys 0m0.000s

$ gcc test.c -o test -pg

$ time ./test

real    0m2.342s
user    0m2.340s
sys 0m0.000s

$ gprof test |head
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
101.33      1.18     1.18                             main

 %         the percentage of the total running time of the
time       program used by this function.
4

3 に答える 3

3

ドロップgprofしてに切り替えることをお勧めしoprofileます。プログラムにインストルメンテーションを挿入するプロファイリングは、結果をゆがめたり無効にしたりする可能性のある方法で、本質的にパフォーマンスに影響を与えます。プロファイリング サポートを使用oprofileしてプログラムをビルドしたり、プロファイリング対応の特別なライブラリを取得したりする必要はありません。これは統計的方法で機能し、基本的に命令ポインターをサンプリングし (カーネルの支援を受けて)、サンプル数を使用して各関数で費やされた時間を推定します。

于 2010-11-30T02:41:46.450 に答える
2

まず第一に、2.3 秒で完了するプログラムのプロファイリングは少しばかげています。プログラムのホットスポットなどを適切に測定するには、長時間実行されるプログラムが本当に必要です。しかし、余談です...

最初の質問に答えるために、時間 (コマンドライン ユーティリティ) は、プロセス全体 (プロファイリング インストルメンテーション自体を含む) の実行時間になります。ビルドでプロファイリングを有効にすると、プログラムを実行するたびに、プログラムは実行時間などを含む gmon.out ファイルを書き込みます。つまり、プロファイリングの大変な作業は、プログラムを実行するたびに行われます。プロファイリング インストルメンテーションは、時間アカウンティングへの独自の影響を分離しようと懸命に努力しています。この場合、プロファイリング自体が実行時間の 2.34 - 1.18 = 1.16 秒を占めているようです (時間で報告)。gprof プログラム自体は、基本的に gmon.out プログラムに格納されているランタイム統計を分析して再フォーマットするだけです。これを明確にするために、実際のプロファイリングは、gprof の実行中ではなく、プログラムの実行中に行われます。

最後に、gprof の出力が 2 番目の質問に直接答えます。プログラムの実行を 1/100 秒でサンプリングします。サンプリング中にたまたま実行されていたものに、0.01 秒全体のクレジットを与えます。プログラムの実行に正確に 0.01 秒の倍数がかからない場合、合計が 100% にならない数値が得られます。繰り返しになりますが、これほど高速に実行されるプログラムのプロファイリングは非常にエラーが発生しやすいことを強調する必要があります。この明らかなバグは、より長いサンプリング間隔 (つまり実行時間) によって確実に軽減されます。また、gprof の独自のオーバーヘッドの計算は不完全であり、一見ばかげているように見える 101.33% という数字にさらに寄与する可能性があります。

これは統計的なプロセスであり、完璧ではありません。結果は大まかに解釈する必要があります。

幸運を!

于 2010-11-30T02:42:42.703 に答える
2

まず、あなたの質問に答えるにgprofは、ブロックされた時間をカウントしないため、「同時に」マシンで何か他のことが起こっている場合、その不一致が表示されます。また、プログラムが何らかの I/O を行う場合、それもカウントされません。

gprof非常に制限されたクラスのプログラムに対してのみ有用です。 ここに問題のリストがあります。

于 2010-11-30T15:42:43.630 に答える