因此,我一直在使用 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 与 Root 函数的已包含时间
类型 函数名称 已用包含时间 已用独占时间 根 DoStuffInLib(void) 2157487 0 来电者_wmain 2157487 0 2157487 0 被调用者 __RTC_CheckEsp 57 57 被调用者_printf 347667 347667 被调用者 THUNK:sin 2282622 81435
已用包含时间定义为执行函数中的代码(包括调用的函数)所花费的时间。根据该定义,DoStuff 的包含时间应始终 > 包含罪的时间。上面的差异是比较小的,但是如果我让这个东西运行一段时间它会变得更大。这种差异在调试和发布模式中都存在。
为什么罪的包容时间更长?我希望它代表根条目时间的一部分。我不太确定发生了什么,或者即使我可以信任这个工具,如果它做看似奇怪的事情。我怀疑我只是错过了一些能让我更清楚的东西。