お気に入りのプロファイリングツールは何ですか(C ++用)[クローズ]


82

これまで、RationalQuantifyのみを使用してきました。IntelのVTuneについて素晴らしいことを聞いたことがありますが、試したことはありません。

編集:私は主にコードをインストルメント化するソフトウェアを探しています。それが非常に良い結果を得る唯一の方法だと思います。


参照:

Windows上のネイティブC ++に適したプロファイラーは何ですか?


1)測定したいですか、それとも2)スピードアップを見つけたいですか?2が必要で、1が必要だと思う場合は、そうではありません。スピードアップを見つけるために、「非常に良い結果」は必要ありません。プログラムが時間の90%を費やして、それが何であるかを知っていれば非常にうまく削除できることをしている場合、スタックサンプルは10回のうち9回表示します。10個のサンプルを見ると、表示されてもかまいません。それは10回、9回、または8回ですか?いずれにせよ、あなたはそれが何であるか知っています。測定されたパーセントは重要ではありません。
Mike Dunlavey 2016年

回答:



27

Linuxの場合: Google Perftools

  • valgrindよりも高速です(ただし、それほど細かくはありません)
  • コードインストルメンテーションは必要ありません
  • 素晴らしいグラフィック出力(-> kcachegrind)
  • メモリプロファイリング、CPUプロファイリング、リークチェックを行います

9

私見、デバッガーを使用したサンプリングが最良の方法です。必要なのは、プログラムを停止できるIDEまたはデバッガーだけです。プロファイラーをインストールする前に、パフォーマンスの問題を解決します。


3
はい!これは私にとって素晴らしいことです。計装は必要ありません。プロファイラーなどをインストールする必要はありません。Linuxでは、gdbを使用できます。プログラムはフルスピードで実行されます。ctrl-cを押して停止します。スタックトレースを表示するには、「bt」と入力します。次に「c」を押して続行し、次にctrl-cを押します。よく働く!この手法を使用すると、複雑なプログラムで実行時間が20%短縮されました。驚くばかり!
ヒューパーキンス2014

@HughPerkins:編集していただきありがとうございます。成功してよかったです。(私はあなたが20%より良くすることができるに
違いない

1
はい、gdb + ctrl-cのみを使用して、数時間の作業で反復時間を1200msから200msに短縮し、ホットスポットを特定しました:-)
Hugh Perkins

@HughPerkins:私にとって、自分のコードで作業している場合、いつ試行をやめるかを知るのは難しいです-私はいつでもそれをも​​う少し絞ることができるようです。他の人のコードで作業しているときは、問題が発生する可能性があります。コードの「所有者」に問題を修正するように説得できるとは限らないため、プロセスが停止します。それは興味深い難問です。
Mike Dunlavey 2014

インストルメンテーションなしでこれを実現したいだけの場合は、Linux上のデバッガーやIDEも必要ありません。「pstack <pid>」を実行するだけで、現在実行中の命令をスタックトレースできます。デバッガーを起動して手動で中断し、スタックトレースを探すよりもはるかに簡単です。
マニッシュソギ

7

C ++のコードをプロファイリング私の唯一の経験があるとAQtimeはAutomatedQA(今SmartBearソフトウェア)で。いくつかのタイプのプロファイラー(パフォーマンス、メモリ、Windowsハンドル、例外トレース、静的分析など)が組み込まれており、結果を取得するためにコードをインストルメント化します。

私はそれを使うのを楽しんだ-コードの小さな変更がパフォーマンスの劇的な改善をもたらすことができるそれらの場所を見つけることはいつも楽しかった。


残念ながら、これはWindowsでのみ機能します。
ブラム

6

私はこれまでプロファイリングを行ったことがありません。昨日、時間保存用の静的タイムテーブル(map <std :: string、long long>)を使用してProfilingTimerクラスをプログラムしました。

コンストラクターは開始ティックを格納し、デストラクタは経過時間を計算してマップに追加します。

ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName += " > ";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

プロファイルするすべての関数(または{block})に、次のものを追加する必要があります。

ProfilingTimer _ProfilingTimer("identifier");

この行は、プロファイルするすべての関数を追加するのが少し面倒です。どの関数に時間がかかるかを推測する必要があるためです。しかし、それはうまく機能し、印刷機能は消費された時間を%で示します。

(他の誰かが同様の「自家製プロファイリング」を使用していますか?それとも単に愚かですか?しかしそれは楽しいです!誰かが改善の提案がありますか?

すべての関数に行を自動追加するようなものはありますか?)


5

私は過去にGlowcodeを広範囲に使用しましたが、それについては前向きな経験しかありませんでした。そのVisualStudio統合は本当に素晴らしく、これは私が今まで使用した中で最も効率的で直感的なプロファイラーです(マネージコードのプロファイラーと比較しても)。

明らかに、Windowsで実行していない場合は役に立ちませんが、質問によって、要件が正確に何であるかがわかりません。


5

間違いなくoprofile; そのシンプルで信頼性が高く、仕事をし、あらゆる種類の素晴らしいデータの内訳を提供できます。


5

Visual Studio 2008のプロファイラーは非常に優れています。高速で、ユーザーフレンドリーで、明確で、IDEに十分に統合されています。


2
チームバージョンのみのプロファイラーではありませんか?
dwj 2010

@dwj:わかりません。Visual Studio Team System 2008 DevelopmentEditionを使用しています。
Dimitri C.

2010
。– dwj

4

Windowsの場合は、Xperfを確認してください。サンプリングされたプロファイルを使用し、いくつかの便利なUIを備えており、インストルメンテーションを必要としません。パフォーマンスの問題を追跡するのに非常に役立ちます。次のような質問に答えることができます。

  • 誰が最もCPUを使用していますか?呼び出しスタックを使用して関数名にドリルダウンします。
  • 誰が最も多くのメモリを割り当てていますか?
  • 最も多くのレジストリクエリを実行しているのは誰ですか?
  • ディスク書き込み?等

ボトルネックはおそらく予想した場所ではないため、ボトルネックを見つけると非常に驚かれることでしょう。


3

プロファイリングにはさまざまな要件があります。インストルメントされたコードは大丈夫ですか、それとも最適化されたコード(またはすでにコンパイルされたコード)をプロファイリングする必要がありますか?行ごとのプロファイル情報が必要ですか?どのOSを実行していますか?共有ライブラリもプロファイリングする必要がありますか?システムコールへのトレースはどうですか?

個人的には、すべての作業にoprofileを使用していますが、すべての場合に最適な選択とは限りません。VtuneとSharkはどちらも優れています。


3

作業しているプラ​​ットフォームについては言及していないので、Linuxではcachegrindと言います。間違いなく。これはValgrindツールセットの一部です。

http://valgrind.org/info/tools.html

コードの最適化のほとんどは内部関数用であるため、そのサブ機能であるCallgrindを使用したことはありません。

利用可能なフロントエンドKCachegrindがあることに注意してください。


3

Windows開発では、SoftwareVerificationのPerformanceValidatorを使用してきました。これは、高速で、適度に正確で、手頃な価格です。さらに、実行中のプロセスをインストルメント化でき、実行時に手動とコールスタックに基づいてデータ収集のオンとオフを切り替えることができます。これは、大きなプログラムの小さなセクションのプロファイリングに最適です。


3

Windowsの場合、AMD Codeanalyst、Intel VTune、およびVisual Studio TeamEditionのプロファイラーを試しました。

Codeanalystはバグがあり(頻繁にクラッシュします)、私のコードでは、その結果はしばしば不正確です。そのUIは直感的ではありません。たとえば、プロファイル結果のコールスタック表示に到達するには、[プロセス]タブをクリックし、プログラムのEXEファイル名をクリックしてから、小さな文字「CSS」が付いたツールバーボタンをクリックする必要があります。しかし、それはフリーウェアなので、試してみるのもよいでしょう。AMDプロセッサがなくても(機能が少なくても)動作します。

VTune($ 700)にはひどいユーザーインターフェースIMOがあります。大規模なプログラムでは、必要な特定の呼び出しツリーを見つけるのが難しく、プログラム内の1つの「ノード」(直接の呼び出し元と呼び出し先を持つ関数)しか見ることができません。完全なものを見ることができません。ツリーを呼び出します。コールグラフビューがありますが、相対的な実行時間をグラフに表示する方法が見つかりませんでした。言い換えると、グラフの関数は、それらに費やされた時間に関係なく同じように見えます。まるで、プロファイリングのポイントを完全に逃したかのようです。

Visual Studioのプロファイラーは3つの中で最高のGUIを備えていますが、何らかの理由で、コードの大部分からサンプルを収集できません(サンプルは、C ++プログラム全体のいくつかの関数についてのみ収集されます)。また、価格や直接購入する方法が見つかりませんでした。しかし、それは私の会社のMSDNサブスクリプションに付属しています。Visual Studioは、マネージコード、ネイティブコード、および混合コードをサポートしています。その点で他の2つのプロファイラーについてはよくわかりません。

結論として、私はまだ良いプロファイラーを知りません!私はここで他の提案を必ずチェックします。


3

私はPCプラットフォームにdevpartnerを使用しています。


コードをインストルメントします。コードカバレッジとバウンドチェック(インストルメント化および非インストルメント化)があります
EvilTeach 2008年

2

Quantify AQTimeを試しましたが、「サブツリーに焦点を合わせる」機能と「サブツリーを削除する」機能が非常に優れているため、Quantifyが勝ちました。


完全なack。私はC ++アプリケーションでいくつかのプロファイリングを行う必要がありました、そしてそれらは本当に私の一日を作った正確な機能でした。
enno

2

唯一の敏感な答えはIntelのPTUです。もちろん、Intelプロセッサで使用し、少なくともC2Dマシンでさらに価値のある結果を得るには、アーキテクチャ自体が意味のあるプロファイルを返すのが簡単であるため、最善の方法です。


2

私はWindowsとLinuxでVTuneを長年使用しており、非常に良い結果が得られています。それ以降のバージョンは、その製品をロシアの開発クルーにアウトソーシングしたときに悪化し、品質とパフォーマンスの両方が低下しました(VTuneのクラッシュが増加し、分析ファイルを開くのに15分以上かかることがよくあります)。

インストルメンテーションに関しては、思ったよりも役に立たないことがわかるかもしれません。私がインストルメンテーションの追加に取り組んだ種類のアプリケーションでは、製品の速度が大幅に低下して機能しなくなることがよくあります(実話:アプリを起動し、家に帰り、翌日戻ってきて、アプリはまだ初期化中です)。また、インストルメント化されていないプロファイリングを使用すると、実際の問題に対応できます。たとえば、VTuneリモート日付コレクターを使用すると、パフォーマンスの問題が発生している数百の同時接続でライブサーバーに対してサンプリングセッションを開始し、テスト環境では再現できない本番環境で発生する問題をキャッチできます。



1

私のお気に入りのツールはEasyProfilerです:http//code.google.com/p/easyprofiler/

これはコンパイル時のプロファイラーです。ターゲット領域を記述するために、一連のルーチンを使用してソースコードを手動でインストルメント化する必要があります。ただし、アプリケーションが実行され、メジャーがXMLファイルに自動的に書き込まれると、結果を定性的なグラフで確認する前に、オブザーバーアプリケーションを開き、分析/比較ツールを数回クリックするだけです。


1

WindowsでのVisualStudio2010プロファイラー。VTuneには優れたコールグラフツールがありましたが、Windows Vista / 7の時点で壊れていました。彼らがそれを修正したかどうかはわかりません。


0

EQATECのプラグを差し上げましょう...私が探していたものだけです...習得と使用が簡単で、ホットスポットをすばやく見つけるために必要な情報を教えてくれます。Visual Studioに組み込まれているものよりもはるかに好きです(公平を期すために、まだVS 2010を試していませんが)。

スナップショットを撮る能力は巨大です。実際のターゲット分析が実行されるのを待っている間に、追加の分析と最適化が行われることがよくあります...それが大好きです。

ああ、その基本バージョンは無料です!
http://www.eqatec.com/Profiler/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.