デバッグオプションを使用してソースコードを再コンパイルする必要があるプロファイラー(gprofなど)と、再コンパイルする必要がないプロファイラー(Valgrind、OProfileなど)を使用する場合の違いは何ですか?
3 に答える
少なくともValgrindとgprofについて話すことができます。
2つを使用することの主な違いは、基本的にはすでに言ったことです。gprofの場合、プロファイリングコードを含めるために特別にコンパイルする必要があります。次に実行可能ファイルを実行すると、プロファイリングコードが実行され(プログラムに組み込まれているため)、gmon.outファイルが作成されます。このファイルは、gprofで処理して、プログラムの実行時統計を表示できます。
Valgrindは、特別な方法でプログラムをコンパイルする必要がないという点で異なります(出力を有用なものにしたい場合は、デバッグシンボルを追加することを除きます)。Valgrindは、プログラムをシミュレートされたCPUで実行される内部形式に動的に変換します(ただし、これは低速です)。これは、特別なコンパイルを必要とせずに、任意のプログラムをValgrindで実行できることを意味します。
もう1つの重要な違いは、Valgrindはgprofよりもはるかに多くの情報を報告できることですが、それは特にそれを使用することとは関係ありません。
名前付きプロファイラーについてはよくわかりませんが、プロファイリングには2つの主要なアプローチがあります。
インストルメンテーション、このメソッドは通常、再コンパイルが必要です(常にではありません。たとえば、javaおよび.Netアプリケーションは動的にインストルメントできます)。この方法を使用すると、ルーチンが呼び出される頻度、または特定のループが行う反復回数を正確に測定できます。
サンペリングは、再コンパイルを必要としない方法であり、設定された間隔でスタックのスナップショットを取得するだけです。これは、ボトルネックを見つけるための効果的な方法であることが証明されています。
ここに2つの戦略に関するいくつかの詳細があります
すべてのプロファイリング手法ではシンボルテーブル情報が必要になるため、コンパイルとリンクで要求する必要があります。
それ以外に、一部のプロファイラーは、各関数の最初と最後に記録保持ルーチンへの呼び出しをコンパイルすることによって機能します。これらの関数は、関数によって使用された時間と、関数がどこから呼び出されたかの記録を記録しようとすることができます。そのタイミングの数値は、これらの記録関数を呼び出すオーバーヘッドによって不正確になります。
他のプロファイラーはそれを行う必要はなく、代わりにコールスタックの定期的なサンプルに依存しています。このようなプロファイラーは、オーバーヘッドが低くなります。そのタイミングの数値は、そのサンプリングの統計的性質によって不正確になります。
これには、「ボトルネック」を特定するためにタイミングの正確さが必要であることが暗示されています。これは、私の知る限り、真実であることが示されたことはありません。桁違いの高速化を実現するために私が常に使用してきた方法は、正確にどれだけの時間が費やされているかではなく、プログラムが時間を費やしているときに何をしているかについての洞察に依存しています。統計的根拠に興味がある場合は、こちらをご覧ください。