そこで、VS 2010 で vsperfreport/vsperfcmd コマンド ライン ツールを使用して vsperfmon を試してみました。プロファイリングを行うための非常に単純なプログラムを作成し、これらのツールが出力する数値を理解しようとしました。
void DoStuff()
{
double res = 0.0;
for (double i = 0.0; i < 10000.0; ++i)
{
res += sin(i);
}
printf("res is %lf", res);
}
int _tmain(int argc, _TCHAR* argv[])
{
DoStuff();
return 0;
}
ここで説明する手順をコマンド ラインで実行して、実行可能ファイルのプロファイルを作成します。上記は perfPlay.exe にコンパイルされ、次の手順を実行します。
vsinstr perfPlay.exe
vsperfcmd /start:trace /output:perfPlay.vsp
perfPlay.exe
vsperfcmd /shutdown
vsperfreport perfPlay.vsp /output:singleFile /summary:All
これが私が理解できない奇妙なことです。DoStuff の包括的経過時間は、関数と呼び出し元/呼び出し先レポートの両方で、sin() の包括的時間よりも短くなっています: DoStuff() の呼び出し元/呼び出し先レポートは次のとおりです。THUNK:sin とルート関数の包括的経過時間に注目してください。
タイプ 機能名 包括的経過時間 排他的経過時間 ルート DoStuffInLib(void) 2157487 0 発信者 _wmain 2157487 0 2157487 0 呼び出し先 __RTC_CheckEsp 57 57 呼び出し先 _printf 347667 347667 Callee THUNK:sin 2282622 81435
包括的経過時間は、呼び出した関数を含む関数内のコードを実行するのにかかった時間として定義されます。その定義によれば、DoStuff の包括時間は常に > 罪の包括時間でなければなりません。上記の差は比較的小さいですが、しばらく放置すると大きくなります。この違いは、デバッグ モードとリリース モードの両方に存在します。
罪の包含時間がより高いのはなぜですか? ルートエントリの時間の一部を表していると思います。何が起こっているのか、あるいは一見奇妙なことをしている場合、このツールを信頼できるかどうかさえよくわかりません. 私は、私にとって物事をより明確にする何かが欠けているだけだと思います。