Почему 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 ответ
Монитор производительности использует датчики для сбора данных. Он пытается вычесть время, затраченное его собственными датчиками, из собранных данных, но это исправление является приблизительным, и оно часто будет последовательно отключаться в одном или другом направлении. Как правило, чем меньше функция, которую вы пытаетесь исследовать, тем больше неточности измерений, поскольку время, затраченное на сбор данных, составляет больший процент от прошедшего времени.