So far, I've only used Rational Quantify. I've heard great things about Intel's VTune, but have never tried it!
Edit: I'm mostly looking for software that will instrument the code, as I guess that's about the only way to get very fine results.
So far, I've only used Rational Quantify. I've heard great things about Intel's VTune, but have never tried it!
Edit: I'm mostly looking for software that will instrument the code, as I guess that's about the only way to get very fine results.
Linux開発の場合(ただし、これらのツールの一部は他のプラットフォームで動作する可能性があります)。これらは私が知っている2つの大きな名前ですが、しばらくの間活発な開発が見られなかった小さな名前は他にもたくさんあります。
Linux の場合: Google Perftools
私見、デバッガーを使用したサンプリングが最良の方法です。必要なのは、プログラムを停止できる IDE またはデバッガーだけです。プロファイラーをインストールする前に、パフォーマンスの問題を解決します。
私の唯一の C++ コードのプロファイリングの経験は、AutomatedQA (現在のSmartBear Software) による AQTime を使用したことです。いくつかのタイプのプロファイラー (パフォーマンス、メモリ、Windows ハンドル、例外トレース、静的分析など) が組み込まれており、コードを計測して結果を取得します。
コードを少し変更するだけでパフォーマンスが劇的に向上する箇所を見つけるのはいつも楽しいものでした。
私はこれまでプロファイリングを行ったことがありません。昨日、時間ストレージ用の静的タイムテーブル (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");
この行は、プロファイリングしたいすべての関数に追加するのが少し面倒です。なぜなら、どの関数に多くの時間がかかるかを推測しなければならないからです。しかし、それはうまく機能し、印刷機能は消費時間を%で示します。
(他の誰かが同様の「自作プロファイリング」を行っていますか?それとも単にばかげているだけですか?しかし、それは楽しいです!改善の提案はありますか?
すべての関数に行を自動追加するようなものはありますか?)
oprofile、間違いなく; そのシンプルで信頼性が高く、仕事をこなし、あらゆる種類のデータの内訳を提供できます。
私は過去にGlowcodeを広範囲に使用してきましたが、それに関してはポジティブな経験しかありませんでした。Visual Studio との統合は非常に優れており、これまで使用した中で最も効率的で直感的なプロファイラーです (マネージ コードのプロファイラーと比較しても)。
明らかに、Windows で実行していない場合は役に立ちませんが、この質問により、要件が正確に何であるかがわかりません。
Visual Studio 2008のプロファイラーは非常に優れています。高速で、ユーザー フレンドリーで、わかりやすく、IDE にうまく統合されています。
Windowsの場合、AMD Codeanalyst、Intel VTune、およびVisual StudioTeamEditionのプロファイラーを試しました。
Codeanalystはバグがあり(頻繁にクラッシュします)、私のコードでは、結果が不正確になることがよくあります。そのUIは直感的ではありません。たとえば、プロファイル結果のコールスタック表示に到達するには、[プロセス]タブをクリックし、プログラムのEXEファイル名をクリックしてから、小さな文字「CSS」が付いたツールバーボタンをクリックする必要があります。しかし、それはフリーウェアなので、試してみるのもよいでしょう。AMDプロセッサがなくても(機能が少なくても)動作します。
VTune($ 700)にはひどいユーザーインターフェイスIMOがあります。大規模なプログラムでは、必要な特定の呼び出しツリーを見つけるのは難しく、プログラム内の1つの「ノード」(直接の呼び出し元と呼び出し先を持つ関数)しか見ることができません。完全なものを見ることができません。ツリーを呼び出します。コールグラフビューがありますが、相対的な実行時間をグラフに表示する方法が見つかりませんでした。言い換えると、グラフの関数は、それらに費やされた時間に関係なく同じように見えます。まるで、プロファイリングのポイントを完全に逃したかのようです。
Visual Studioのプロファイラーは3つの中で最高のGUIを備えていますが、何らかの理由で、コードの大部分からサンプルを収集できません(サンプルは、C ++プログラム全体のいくつかの関数についてのみ収集されます)。また、価格や直接購入する方法が見つかりませんでした。しかし、それは私の会社のMSDNサブスクリプションに付属しています。Visual Studioは、管理対象、ネイティブ、および混合コードをサポートします。その点で他の2つのプロファイラーについてはよくわかりません。
結論として、私はまだ良いプロファイラーを知りません!ここで他の提案を確認してください。
Windows の場合は、Xperfを確認してください。サンプリングされたプロファイルを使用し、便利な UI を備えており、インストルメンテーションは必要ありません。パフォーマンスの問題を追跡するのに非常に役立ちます。次のような質問に答えることができます。
ボトルネックはおそらく予想していた場所ではないので、ボトルネックを見つけると驚くことでしょう。
作業しているプラットフォームについて言及していないので、Linux では cachegrind と言います。絶対。Valgrind ツールセットの一部です。
http://valgrind.org/info/tools.html
私のコードの最適化のほとんどは内部関数用であるため、サブ機能 Callgrind を使用したことはありません。
利用可能なフロントエンド KCachegrind があることに注意してください。
There are different requirements for profiling. Is instrumented code ok, or do you need to profile optimized code (or even already compiled code)? Do you need line-by-line profile information? Which OS are you running? Do you need to profile shared libraries as well? What about trace into system calls?
Personally, I use oprofile for everything I do, but that might not be the best choice in every case. Vtune and Shark are both excellent as well.
Windows の開発には、Software Verification のPerformance Validatorを使用してきました。これは、高速で、適度に正確で、手頃な価格です。さらに、実行中のプロセスをインストルメント化でき、実行時にデータ収集を手動で、またはコールスタックに基づいてオンまたはオフにすることができます。これは、大きなプログラムの小さなセクションをプロファイリングするのに最適です。
PC プラットフォームにはdevpartnerを使用しています。
ElectricFence は malloc のデバッグにうまく機能します
私は AQTime の Quantify を試しましたが、Quantify は、その非常に貴重な「サブ ツリーにフォーカス」および「サブ ツリーを削除」機能のために勝ちました。
唯一の機密性の高い答えは、IntelのPTUです。もちろん、アーキテクチャ自体が意味のあるプロファイルを返すのが簡単であるため、Intel プロセッサで使用し、少なくとも C2D マシンでさらに価値のある結果を得るのが最善です。
私は、Windows と Linux で VTune を長年使用しており、非常に良い結果が得られています。その後のバージョンは悪化し、その製品をロシアの開発チームに外注したため、品質とパフォーマンスの両方が低下しました (VTune のクラッシュが増加し、解析ファイルを開くのに 15 分以上かかることがよくありました)。
インストルメンテーションに関しては、思ったほど役に立たないことに気付くかもしれません。私が取り組んできた種類のアプリケーションでは、インストルメンテーションを追加すると、製品が遅くなりすぎて機能しなくなることがよくあります (実話: アプリを起動し、家に帰り、翌日戻ってきても、アプリはまだ初期化中です)。また、計測されていないプロファイリングを使用すると、ライブの問題に対応できます。たとえば、VTune リモート デート コレクターを使用すると、パフォーマンスの問題が発生している数百の同時接続を持つライブ サーバーに対してサンプリング セッションを開始し、テスト環境では再現できない本番環境で発生する問題を検出できます。
Windows での Visual Studio 2010 プロファイラー。VTune には優れたコール グラフ ツールがありましたが、Windows Vista/7 で機能しなくなりました。彼らがそれを修正したかどうかはわかりません。
私のお気に入りのツールは Easy Profiler です: http://code.google.com/p/easyprofiler/
これはコンパイル時のプロファイラーです。ターゲット領域を記述するために、一連のルーチンを使用してソース コードを手動で計測する必要があります。ただし、アプリケーションが実行され、メジャーが XML ファイルに自動的に書き込まれると、Observer アプリケーションを開いて分析/比較ツールを数回クリックするだけで、結果を定性チャートで確認できます。
EQATEC のプラグを差し上げましょう...まさに私が探していたものです...習得と使用が簡単で、ホットスポットをすばやく見つけるために必要な情報を提供してくれます。私は、Visual Studio に組み込まれているものよりもはるかに好きです (VS 2010 のものはまだ試していませんが、公平を期すために)。
スナップショットを撮る機能は巨大です。実際のターゲット分析が実行されるのを待っている間に、追加の分析と最適化が行われることがよくあります...気に入っています。
ああ、その基本バージョンは無料です!
http://www.eqatec.com/Profiler/