これまで、RationalQuantifyのみを使用してきました。IntelのVTuneについて素晴らしいことを聞いたことがありますが、試したことはありません。
編集:私は主にコードをインストルメント化するソフトウェアを探しています。それが非常に良い結果を得る唯一の方法だと思います。
これまで、RationalQuantifyのみを使用してきました。IntelのVTuneについて素晴らしいことを聞いたことがありますが、試したことはありません。
編集:私は主にコードをインストルメント化するソフトウェアを探しています。それが非常に良い結果を得る唯一の方法だと思います。
回答:
Linux開発用(ただし、これらのツールの一部は他のプラットフォームで動作する可能性があります)。これらは私が知っている2つの大きな名前ですが、しばらくの間活発な開発が見られなかった小さな名前は他にもたくさんあります。
Linuxの場合: Google Perftools
私見、デバッガーを使用したサンプリングが最良の方法です。必要なのは、プログラムを停止できるIDEまたはデバッガーだけです。プロファイラーをインストールする前に、パフォーマンスの問題を解決します。
私はこれまでプロファイリングを行ったことがありません。昨日、時間保存用の静的タイムテーブル(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");
この行は、プロファイルするすべての関数を追加するのが少し面倒です。どの関数に時間がかかるかを推測する必要があるためです。しかし、それはうまく機能し、印刷機能は消費された時間を%で示します。
(他の誰かが同様の「自家製プロファイリング」を使用していますか?それとも単に愚かですか?しかしそれは楽しいです!誰かが改善の提案がありますか?
すべての関数に行を自動追加するようなものはありますか?)
Visual Studio 2008のプロファイラーは非常に優れています。高速で、ユーザーフレンドリーで、明確で、IDEに十分に統合されています。
作業しているプラットフォームについては言及していないので、Linuxではcachegrindと言います。間違いなく。これはValgrindツールセットの一部です。
http://valgrind.org/info/tools.html
コードの最適化のほとんどは内部関数用であるため、そのサブ機能であるCallgrindを使用したことはありません。
利用可能なフロントエンドKCachegrindがあることに注意してください。
Windows開発では、SoftwareVerificationのPerformanceValidatorを使用してきました。これは、高速で、適度に正確で、手頃な価格です。さらに、実行中のプロセスをインストルメント化でき、実行時に手動とコールスタックに基づいてデータ収集のオンとオフを切り替えることができます。これは、大きなプログラムの小さなセクションのプロファイリングに最適です。
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つのプロファイラーについてはよくわかりません。
結論として、私はまだ良いプロファイラーを知りません!私はここで他の提案を必ずチェックします。
私はPCプラットフォームにdevpartnerを使用しています。
私はWindowsとLinuxでVTuneを長年使用しており、非常に良い結果が得られています。それ以降のバージョンは、その製品をロシアの開発クルーにアウトソーシングしたときに悪化し、品質とパフォーマンスの両方が低下しました(VTuneのクラッシュが増加し、分析ファイルを開くのに15分以上かかることがよくあります)。
インストルメンテーションに関しては、思ったよりも役に立たないことがわかるかもしれません。私がインストルメンテーションの追加に取り組んだ種類のアプリケーションでは、製品の速度が大幅に低下して機能しなくなることがよくあります(実話:アプリを起動し、家に帰り、翌日戻ってきて、アプリはまだ初期化中です)。また、インストルメント化されていないプロファイリングを使用すると、実際の問題に対応できます。たとえば、VTuneリモート日付コレクターを使用すると、パフォーマンスの問題が発生している数百の同時接続でライブサーバーに対してサンプリングセッションを開始し、テスト環境では再現できない本番環境で発生する問題をキャッチできます。
ElectricFenceはmallocデバッグにうまく機能します
私のお気に入りのツールはEasyProfilerです:http://code.google.com/p/easyprofiler/
これはコンパイル時のプロファイラーです。ターゲット領域を記述するために、一連のルーチンを使用してソースコードを手動でインストルメント化する必要があります。ただし、アプリケーションが実行され、メジャーがXMLファイルに自動的に書き込まれると、結果を定性的なグラフで確認する前に、オブザーバーアプリケーションを開き、分析/比較ツールを数回クリックするだけです。
EQATECのプラグを差し上げましょう...私が探していたものだけです...習得と使用が簡単で、ホットスポットをすばやく見つけるために必要な情報を教えてくれます。Visual Studioに組み込まれているものよりもはるかに好きです(公平を期すために、まだVS 2010を試していませんが)。
スナップショットを撮る能力は巨大です。実際のターゲット分析が実行されるのを待っている間に、追加の分析と最適化が行われることがよくあります...それが大好きです。
ああ、その基本バージョンは無料です!
http://www.eqatec.com/Profiler/