0

アプリケーションのパフォーマンスを調整しようとしています。また、どのメソッドの処理に最も時間がかかるのか知りたいので、最適化の機会を探す必要があります。

コールスタックと各メソッドの完了にかかる時間を視覚化するのに役立つ既存の無料ツールはありますか?コールスタックを積み上げ棒グラフまたはツリーマップとして表示するものを考えているので、 MethodA()が3秒と7秒かかったMethodB()Method(C)を呼び出したため、完了までに10秒かかったことが簡単にわかります。完了。

このようなものはありますか?

4

4 に答える 4

2

はい、それらはパフォーマンスプロファイラーと呼ばれます。RedGate ANTSとJetBrainsのdotTraceをチェックしてください。無料ではありませんが、かなり安価で、私が見たどの無料の代替品よりもはるかに優れています。

于 2009-08-01T23:17:47.140 に答える
0

いくつかのプロファイラーが利用可能です。私は1つ(Visual Studio Team Suiteに含まれているもの)にしか精通していませんが、無料ではありません。私が言わなければならないのは、それは私が別のものに切り替えようとすることを望んでいなかったほど強力で信頼できるものでした。私が聞いたもう1つのものは、Red Gateの.NETプロファイラーです(これも無料ではありません)。これらの両方には、あなたが求めているものを含むが、これに限定されない機能セットがあります。これが商用アプリケーション開発用である場合は、ぜひチェックしてください。:)

于 2009-08-01T23:18:56.560 に答える
0

これを測定する方法は、プロファイラー内の計測またはサンプリングのいずれかによるものです。

計装

Instrumentationは、すべてのコードを書き直して次のことを行うのとほぼ同じです。

public void Foo()
{
   //Code
}

の中へ

public void Foo()
{
   InformTheProfilingCodeThatFooStarted();
   //Code
   InformTheProfilingCodeThatFooEnded();
}

プロファイラーはすべてがいつ開始および停止するかを知っているので、thisngsがいつ開始および停止するかのスタックを管理し、後でこの情報を提供できます。多くの場合、これをラインレベルで実行できます(ほとんど同じことを実行しますが、各行の前にさらに多くのインストルメントを実行します。

これにより、アプリケーションの「コールグラフ」に関する100%正確な情報が得られますが、メソッドのインライン化を防ぎ、各メソッド呼び出しにかなりのオーバーヘッドを追加するという犠牲を払って取得します。

サンプリング

別のアプローチはサンプリングです。

100%正確なコールグラフを取得しようとする代わりに、実際の時間は正確ではありませんが、このアプローチは、アプリで何が起こっているかを定期的にチェックする場合に、どれだけの量かを知ることができるということに基づいて機能します実際にこれを解決するために多くの労力を費やす必要なしに、それがさまざまな機能に分離する時間。ほとんどのサンプリングプロファイラーは、プログラムに割り込んだときに呼び出しスタックを「解析」する方法を知っているので、どの関数を呼び出しているのか、これにかかる時間はどれくらいかを合理的に把握できますが、これが(たとえば)Bar()への10回の呼び出しを行ったFoo()への10回の呼び出し、または10回サンプリングされた非常に長い間続いたBar()への1回の呼び出しにあったFoo()への1回の呼び出し。

どちらのアプローチにも長所と短所があり、さまざまな問題を解決します。一般に、サンプリング方法は、侵襲性が低く、何が時間がかかるかについてより正確な情報を提供する必要があるため、最初に開始するのに最適です。これは、理由を理解する前に最も重要な最初の質問であることがよくあります。

VS 2008 Team Systemリリースにリンクされている無料の再配布可能なプロファイラーである.netコード用の無料のサンプリングプロファイラーを1つだけ知っています(ただし、個別にダウンロードできます)。結果の出力は、Visual Studioの(非常に高価な)TeamSystemエディション以外では簡単に表示できません。

Red Gate ANTSは(現時点では)サンプリングをサポートしていません。JetBrains(dotTrace)とMS Visual Studio Team Systemには、両方のスタイルをサポートするプロファイラーがあります。費用便益ベースでどちらを好むかは意見の問題です。

于 2009-08-01T23:59:56.150 に答える
0

これが私が使っている方法です。一時停止ボタンのあるIDEを使用している場合、費用はかからず、非常にうまく機能します。

それがあなたに伝えるのは、各ルーチンで、より正確には、各ステートメントで、実時間の何パーセントが費やされているかということです。これは、呼び出しカウントを自動的に考慮に入れるため、ルーチンまたはステートメントの実行の平均期間よりも重要です。実時間をサンプリングすることにより、CPU、IO、およびその他の種類のシステム時間が自動的に含まれます。

さらに重要なことに、ルーチンが呼び出しスタックにあるサンプルを見ると、ルーチンが何をしているのかだけでなく、その理由もわかります。重要な理由は、あなたが本当に探しているのは、より速いものに置き換えることができる時間を費やしているということです。「なぜ」の情報がなければ、それが何であるかを推測する必要があります。

ところで:この手法は、主に教授が(たとえ知っていても)教えていないため、あまり知られていません。現実の世界のように巨大なソフトウェアを使用する必要がほとんどないため、gprofプロファイリングの基本的なパラダイムとして扱われます。

使用例を示します。

PSパーセントの合計が100%をはるかに超えると予想します。パーセントについて考える方法は、ステートメントまたはルーチンがX%の時間(少数のサンプルから推定)スタック上にある場合、ステートメントまたはルーチンの場合、おおよその実時間はどれだけ短縮されるかです。時間を大幅に短縮することができます。

于 2009-08-02T20:17:52.630 に答える