Warum sagt mir VSPERFMON mir, dass die inklusive Zeit der Funktion länger dauert als die Wurzelfunktion?
-
27-10-2019 - |
Frage
Daher habe ich mit VSPERFMON über die Befehlszeilen -Tools vSsperFrport/vsperfcmd mit VS 2010 experimentiert. Ich habe ein wirklich einfaches Programm zum Profilieren und Versuch, die Zahlen zu verstehen, die diese Tools ausgeben:
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;
}
Ich profiliere die ausführbare Datei, indem ich die Schritte wie detailliert ausführe hier in der Befehlszeile. Das obige wird zu perfplay.exe zusammengestellt, dann mache ich die folgenden Schritte:
vsinstr perfPlay.exe
vsperfcmd /start:trace /output:perfPlay.vsp
perfPlay.exe
vsperfcmd /shutdown
vsperfreport perfPlay.vsp /output:singleFile /summary:All
Hier ist das Seltsame, was ich nicht herausfinden kann. Die verstrichene inklusive Zeit für Dostuff ist weniger als Die inklusive Zeit für SIN () sowohl in der Funktion als auch im Anrufer/Callee -Bericht: Hier ist der Anrufer/Callee -Bericht für Dostuff (), beachten Sie die verstrichene inklusive Zeit für Thunk: Sin vs
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
Verstrichene inklusive Zeit ist definiert als die Zeit, die für die Ausführung von Code in Ihrer Funktion benötigt wird einschließlich Funktionen, die Sie anrufen. Nach dieser Definition sollte Dostuffs inklusive Zeit immer die inklusive Zeit der Sünde sein. Der obige Unterschied ist relativ klein, aber wenn ich dieses Ding für eine Weile laufen lasse, wird es größer. Dieser Unterschied besteht sowohl im Debug- als auch im Release -Modus.
Warum ist es der Fall, dass die inklusive Zeit der Sünde höher ist? Ich würde erwarten, dass es einen Teil der Zeit des Stammeintrags darstellt. Ich bin mir nicht ganz sicher, was los ist oder auch wenn ich diesem Tool vertrauen kann, wenn es scheinbar seltsames Zeug tut. Ich vermute jedoch, dass mir nur etwas fehlt, das die Dinge für mich klarer machen würde.
Lösung
Der Leistungsmonitor verwendet Sonden, um Daten zu sammeln. Es versucht, die Zeit, die von den eigenen Sonden von den gesammelten Daten benötigt wird, zu subtrahieren, diese Korrektur ist jedoch ungefähr und wird häufig konsequent in die eine oder andere Richtung ausgeschaltet. Je kleiner die Funktion, die Sie zu untersuchen möchten, desto ungenauer die Messungen, da die Zeit zum Sammeln der Daten ein höherer Prozentsatz der Zeit ist.