web-dev-qa-db-ja.com

CおよびC ++ソースコードプロファイリングツール

可能性のある複製:
お気に入りのプロファイリングツールは何ですか(C++用)

CとC++の混合であるソースコードをプロファイルするための優れたツールはありますか。どんな長所と短所は何ですか、そしてどれを使用したことがあり、使用することをお勧めします。 Googleからツールのリストを取得しないでください。私もそれを行うことができます。私が欲しいのは、これらのツールを使用し、長所と短所を知っている人の個人的な経験を活用することです。
前もって感謝します。

23
Alok Save

gprof が最高のCPUホットスポットプロファイラーであり、 Google Performance Tools が最高のサンプリングプロファイラーであることがわかりました。どちらもCおよびC++で機能します。

私の意見では Windowsには適切なプロファイリングツールはありません です。

GNU gprofの長所と短所

  • GCCのみ
  • CおよびC++で動作します
  • CPU時間のみを扱い、バイナリの内側をコード化します。静的にリンクされたプロファイルに必要なすべてが必要です
  • 非常に正確
  • 実行に小さなオーバーヘッドを追加します

Google Performance Toolsの長所と短所

  • GNUツールチェーンが必要だと思います
  • シンボルを識別できないことがある
  • 非常にカスタマイズ可能
  • Callgrind形式を含むさまざまな形式に出力し、KCacheGrindを自動的にロードします
  • さまざまなメモリプロファイリングツールもあります
  • samplingプロファイラーであり、オーバーヘッドは最小限です

関連する役立つ質問と回答

33
Matt Joiner

マットには敬意を払いません。

私がWindowsでいつも使用しているツールは ランダムポーズ手法 であり、IDEがサポートするすべての言語で動作します。

これを使用してパフォーマンスチューニングを行う例として、 この場合 は、一連のステップによって43倍のスピードアップが達成されたことを示しています。

Gprofには多くの問題があります ここにリストされています 、そしてgoogle-perftoolsのマニュアルによると、同じ問題のいくつかがそこで繰り返されています。グラフなどを強調します(ブロックされている間にサンプリングするかどうかはドキュメントからはわかりません)。

ソフトウェアシステムがますます大きくなるにつれて、セルフタイムはますます重要ではなくなります。プログラムカウンターは、ほとんどの時間をライブラリルーチンに費やすか、システムでブロックされます。グラフは巨大な巣になります。 「関数Xが高額であることは知っていますが、関数Xのどこに問題があるのか​​?」さらに、「ボトルネック」はどんどん大きくなっています。これは、スタックが平均してより深くなるためです。また、スタックのすべての層は、必要以上の関数呼び出しを実行する新たな機会です。

行ごとのパーセントとブロック中のサンプルを報告し、ユーザー入力中にサンプルセットを希釈しないようにユーザーがサンプリングを制御できるようにするスタックサンプラーの例は Zoom です。

編集:申し訳ありませんが、一人で十分に離れることはできません。新しい説明は次のとおりです。

プログラムの動作方法は、ウィンドウの外のオークツリーによく似た呼び出しツリーをトレースします。枝(呼び出しサイト)を発芽させる幹(メイン)があり、葉(指示)とどんぐり(ブロッキングコール)にいくつかのレベルでさらに分岐します。

木の外科医がプルーンに来たとき(最適化)、葉のある場所(ホットスポット)だけを見ますか?彼はドングリを無視しますか(ブロッキング中にサンプルはありません)?いいえ、彼は重い(スタック上で)重く、不健康(不要)なブランチ(呼び出しサイト)を探しています。それらは彼が剪定するものです。それがランダム一時停止とズームが行うことであり、それらの呼び出しサイトを見つけるのに役立ちます。

4
Mike Dunlavey

Callgrind を使用して、プロファイリング出力を作成できます。 Valgrind の一部です。 Callgrind-outputは KCacheGrind と共に使用できます。これは、Linuxを使用している限り、一見の価値があります。

3
MOnsDaR

AMD CodeAnalyst はかなりいいです。また、プラットフォーム固有のボトルネックが見つかったときにニースであるクロスプラットフォームでもあります。

2
Vitor Py