これを測定する方法は、プロファイラー内の計測またはサンプリングのいずれかによるものです。
計装
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には、両方のスタイルをサポートするプロファイラーがあります。費用便益ベースでどちらを好むかは意見の問題です。