5

アプリの「RelDebug」ビルドでVisualStudio2008プロファイラーを実行します。最適化はオンになっていますが、インライン化は中程度であり、スタックフレームが存在し、シンボルが出力されます。言い換えると、RelDebugは、デバッグ可能なある程度最適化されたビルドです(ただし、変数の検査に関する通常のリリースの警告が適用されます)。

サンプリングとインストルメント化プロファイラーの両方を別々の実行で実行します。

結果?サンプリングプロファイラーは、妥当に見える結果を生成します。ただし、インストルメント化されたプロファイラーの結果を見ると、リストの一番上にあるべきではない関数が表示されます。

たとえば、クラスメンバーに高さを割り当てる1行のみで構成される「SetFont」のような関数。または、単に長方形を割り当てる「SetClipRect」。

もちろん、私は「排他的」統計(つまり、子供を差し引いたもの)を見ています。

これは他の誰かに起こりますか?私のアプリケーションが特定のサイズに成長すると、それは常に起こるようです。その時点では、インストルメントされたプロファイラーは役に立たなくなります。

私は問題を理解しました。VisualStudio2008とVisualStudio2010プロファイラーはどちらも平凡です(丁寧に言えば)。vTuneアンプ(プロファイラー)が付属しているインテル®C++スタジオを購入しました。まったく同じコードでIntelプロファイラーを使用すると、実際に意味のあるプロファイラーの結果を得ることができました。

4

2 に答える 2

2

あなたは「もちろんあなたは独占を見ている」と言います。包括的統計を見てください。最も単純なプログラムやアルゴリズムを除いて、ほとんどすべての時間がサブルーチンと関数に費やされているため、パフォーマンスの問題が発生した場合は、時間の浪費であるとは知らなかった呼び出しで構成されている可能性があります。

私が頼りにしている方法はこれです。コードを高速化するために何を修正できるかを見つけようとしていると仮定すると、問題ではないことに関する高精度の統計で時間を無駄にすることなく、コードを見つけることができます。

于 2009-08-31T19:43:17.060 に答える
1

バグはありません。サンプリングでは、通話ごとに費やした時間を知ることはできません。プロファイラーは、タイマーがその特定の機能で終了した回数をカウントしているだけです。SetFontは頻繁に呼び出されないため、その関数で多くのヒットが発生することはなく、その関数に時間がかからないという印象を受けます。

一方、インストルメンテーションを実行すると、プロファイラーはすべての呼び出しをカウントし、すべての関数の実行時間を測定します。そのため、関数のCPU消費量に関する正確な情報を取得できます。

インストルメンテーションの結果を調べるときは、常に呼び出しの数も調べる必要があります。SetFontはAPIが少ないため、排他的か包括的かは関係ありません。重要なのは、全体の時間と呼び出される頻度だけです。

于 2009-09-01T07:37:43.723 に答える