Почему vsperfmon говорит мне, что инклюзивное время вызываемой функции занимает больше времени, чем корневая функция?

Поэтому я экспериментировал с vsperfmon с помощью инструментов командной строки vsperfreport/vsperfcmd с VS 2010. Я создал очень простую программу для профилирования и постараюсь понять числа, которые эти инструменты выводят:

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 vs функция Root

Тип Название функции Истекшее включенное время Истекшее исключительное время  
Root        DoStuffInLib(void)  2157487                 0
Звонящий _wmain  2157487 0   2157487                 0
Callee      __RTC_CheckEsp      57                      57  
Callee      _printf             347667                  347667  
Callee      THUNK: грех 2282622                 81435   

Истекшее включенное время определяется как количество времени, затрачиваемое на выполнение кода в вашей функции, включая вызываемые вами функции. Согласно этому определению, время, в котором учится Дестуфф, всегда должно быть> временем, включающим грех. Разница выше относительно невелика, но если я позволю этой вещи работать некоторое время, она станет больше. Эта разница существует как в режимах Debug, так и в Release.

Почему случай, когда грех включительно, выше? Я ожидал бы, что это представит часть времени Корневой записи. Я не совсем уверен, что происходит, и даже если я могу доверять этому инструменту, если он делает, казалось бы, странные вещи. Хотя я подозреваю, что мне просто не хватает чего-то, что могло бы прояснить для меня.

1 ответ

Решение

Монитор производительности использует датчики для сбора данных. Он пытается вычесть время, затраченное его собственными датчиками, из собранных данных, но это исправление является приблизительным, и оно часто будет последовательно отключаться в одном или другом направлении. Как правило, чем меньше функция, которую вы пытаетесь исследовать, тем больше неточности измерений, поскольку время, затраченное на сбор данных, составляет больший процент от прошедшего времени.

Другие вопросы по тегам