web-dev-qa-db-ja.com

Cプロファイラーの推奨事項?

誰もが常に最適化を実行する前にプログラムをプロファイリングするように言いますが、誰もその方法を説明することはありません。

Cコードをプロファイリングするためのプラクティスは何ですか?

40
Michael

gccを使用して、-pgでコンパイルおよびリンクし(例 here で説明)、プログラムの実行を続行します(そのURLでも提案されている原則に従って)。 gprofを使用します。異なるコンパイラー&cを使用している場合、ツールは異なりますが、それでも、コードのプロファイリングの方法と理由に関する一般的なアイデアに関する部分には、URLが推奨されます。

29
Alex Martelli

Linuxを使用している場合は、 ValGrindCallGrindおよびKCacheGrind の組み合わせをお勧めします。 ValGrindはメモリリークを見つけるための優れた方法であり、CallGrind拡張機能は優れたプロファイラを作成します。

[〜#〜]ノート[〜#〜]:私はただ 学習済み ValGrindがMac OSXでも動作するようになりました。ただし、CallGrindとKCacheGrindは2005年以降更新されていません。 other front-ends を参照してください。

13
Chip Uni

完成させるために oprofile を追加します。カーネルのベンチマークを行う場合は特に興味深いです。

2
tr9sh

聞いてよかった:-)逆張りを気にしない場合は、次の回答を確認してください。

簡単に言えば、

  1. プログラムはあなたを待っていますか、それともあなたはそれを待っていますか?待てない場合は問題ありませんので、そのままにしておいてください。

  2. それがあなたを待たせる場合は、次に進みます。

私はサンプリングがお勧めです。これは、プログラムがビジーなとき(あなたを待っていないとき)にプログラムが何をしているかのストロボスコープX線を取得することです。プログラムカウンタだけでなく、少なくともコールスタックのサンプルを取得します。プログラムカウンターのサンプルのみを取得する場合、プログラムがI/Oやライブラリルーチンでかなりの時間を費やしても意味がありません。そのため、それで解決しないでください。

多くのサンプルを取得したい場合は、プロファイラーが必要です。数個しか必要ない場合は、デバッガーの一時停止ボタンが問題なく機能します。私の経験では、20で十分であり、多くの場合5で十分です。

どうして?呼び出しスタックのサンプルが1000あるとします。各サンプルは、費やされている実時間の断片を表していますスタック上のコードのすべての1行が要求したためのみ。したがって、1000のうち557のサンプルに表示されるコード行がある場合は、それが557/1000の時間の原因であると想定して、いくつかのサンプルを与えるか、または取得します(15)。つまり、実行時間全体で100ドルかかる場合は、その行自体が55.70ドルかかり、1.50ドルを与えるか取るので、本当に必要かどうかを確認する必要があります。

しかし、1000個のサンプルが必要ですか?その行のコストが約55.7%である場合、10個のサンプルしか取得しなかった場合、そのうちの6つで表示され、1.5個のサンプルを取得または取得します。したがって、10個中6個のサンプルでステートメントが表示された場合、その100ドルのうちおよそ45ドルから75ドルのコストがかかっていることがわかります。たったの45ドルという低価格であったとしても、本当にそれが必要かどうかを見たくありませんか。

そのため、多くのサンプルは必要ありません。それほど多くの精度は必要ありません。必要なのは、スタックサンプルが提供するものです。これらは、最適化する最も価値のある行を正確に示します。

**サンプル数の標準偏差はsqrt( f * (1-f) * nsamp )です。ここで、fはラインを含むサンプルの割合です。

2
Mike Dunlavey

Shark/Instruments(dtraceを使用)は、Macで使用できるプロファイラーです。彼らはかなり良いです。

1
Georg Schölly

Visual Studio Team System には優れたプロファイラーが付属しています。また、 Intel VTune も悪くありません。

0
Alex Budovski