为什么vsperfmon告诉我被叫函数的包容时间比根函数要长?

时间:2012-02-17 02:33:55

标签: c++ visual-studio-2010 profiling vsperfmon

所以我一直在通过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;
}

我通过在命令行运行详细here的步骤来分析可执行文件。以上编译为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的经历包含时间:罪与根函数

Type        Function Name       Elapsed Inclusive Time  Elapsed Exclusive Time  
Root        DoStuffInLib(void)  2157487                 0
Caller      _wmain  2157487 0   2157487                 0
Callee      __RTC_CheckEsp      57                      57  
Callee      _printf             347667                  347667  
Callee      THUNK:sin           2282622                 81435   

经过的包含时间定义为在您的函数中执行代码所花费的时间,包括您调用的函数。根据该定义,DoStuff的包容时间应始终为>罪的包容时间。上面的差异相对较小,但如果我让这个东西运行一段时间它会变大。调试和发布模式都存在这种差异。

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

1 个答案:

答案 0 :(得分:3)

性能监视器使用探针来收集数据。它试图从收集的数据中减去自己的探测器所花费的时间,但这种校正是近似的,并且通常会在一个方向或另一个方向上一致地关闭。通常,您尝试探测的功能越小,测量的误差就越大,因为收集数据所花费的时间占经过时间的百分比更高。