为什么 vsperfmon 告诉我被调用函数的包含时间比根函数的包含时间更长?

Why does vsperfmon tell me the called function's inclusive time is taking longer then the root function's?

本文关键字:包含 时间 函数 vsperfmon 为什么 告诉我 调用      更新时间:2023-10-16

因此,我一直在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与根函数的Elapsed Inclusive Time

类型函数名称占用的非独占时间占用的独占时间根DoStuffInLib(无效)2157487 0呼叫者_wmain 2157487 0 2157487被叫__RTC_CheckEsp 57 57被叫方打印347667 347667被叫THUNK:sin 2282622 81435

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

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

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