1

因此,我一直在使用 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 的包含时间应始终 > 包含罪的时间。上面的差异是比较小的,但是如果我让这个东西运行一段时间它会变得更大。这种差异在调试和发布模式中都存在。

为什么罪的包容时间更长?我希望它代表根条目时间的一部分。我不太确定发生了什么,或者即使我可以信任这个工具,如果它做看似奇怪的事情。我怀疑我只是错过了一些能让我更清楚的东西。

4

1 回答 1

3

性能监视器使用探针来收集数据。它试图从收集的数据中减去它自己的探测器所花费的时间,但这种校正是近似的,它通常会在一个方向或另一个方向上始终保持关闭。通常,您尝试探测的函数越小,测量越不准确,因为收集数据所花费的时间占已用时间的百分比较高。

于 2012-02-17T02:48:04.600 回答