これは肥大化した質問のようなものですので、事前にお詫び申し上げます。gprof
低技術レベルでどのように機能するのか興味があります。タイマーによって行われることは理解していますが、プロファイルするために実行可能ファイルを特別にコンパイルする必要があるのはなぜですか? コンパイルにより、統計用にスペースが割り当てられますか?
また、タイミングは正確にどのように行われますか?
論文を(もう一度)読んだので、説明を試みます。
プロセスが IO またはその他の理由でブロックされている場合を除き、100Hz でサンプルを取得するとします。各サンプルは、何らかの機能にある PC を記録します。その関数のサンプル数がインクリメントされます。
したがって、実行の最後に (たとえば) 1000 個のサンプルがあった場合、合計実行時間 (CPU のみ) は 10 秒でした。ルーチン B がたとえば 500 個のサンプルを記録した場合、その合計実行時間は合計の 1/2、つまり 5 秒であることを意味します。PCが入っているのでセルフタイムです。これは、平均して実行にかかる時間を示しているわけではありません。それを伝えるには、それが何回呼び出されたかを知る必要があります。また、呼び出し先で費やされた時間も含まれません。
-pgフラグを指定してコードをコンパイルすると、各ルーチンのエントリ コードに特別な呼び出しが挿入されます。これは、ルーチン B が入力されたことを認識し、ルーチン A の呼び出しサイトから呼び出されたことを認識します。その呼び出しサイトによってインデックス付けされたテーブルがあり、その呼び出しをカウントできます。したがって、最後に gprof は、B が合計で何回呼び出され、そのうちの何回が A から呼び出されたかを知ることができます。
B の平均セルフ時間を取得するには、その合計セルフ時間を呼び出し回数で割ります。
ルーチン A の合計累積時間 (自己と呼び出し先) を取得するために、gprof は、A の自己時間に、各従属ルーチン B を呼び出す合計回数を加え、B の平均累積時間を掛ける必要があります。 A の平均累積時間を取得するために、A への呼び出しの合計数で割ります。
再帰が絵に入るまでは良さそうに聞こえますが、さらに混乱します。
それはすべて非常に巧妙であり、著者が指摘するように、注意点がたくさんあります。
まあ、これは良い説明を与えます。また、これは統計プロファイリングについても説明しています
基本的に、gprof はプログラムの実行可能ファイルを変更し (これをコードの計測と呼びます)、関数が呼び出された回数などの簿記情報を保存します。
統計プロファイリング ビットは、プログラム カウンターを定期的にスヌーピングして、コードの実行内容のサンプルを取得することから得られます。
Gprof は両方を行います。コードを計測し、プログラム カウンターを見てサンプルを収集します。