2017-03-28 3 views
-1

Ich versuche, die CPU-und Wandzeit für mein Programm zu messen. Der Code sollte unter Windows laufen, also ist es in Ordnung, plattformspezifische Funktionen zu verwenden. Für die Wandzeit verwende ich QueryPerformanceCounter() und es ist präzise. Wenn ich GetProcessTimes() verwende, erhalte ich eine Genauigkeit von 15.625 Millisekunden. Unter MSDN heißt es, dass die Genauigkeit der zurückgegebenen CPU-Zeit 100 Nanosekunden beträgt. Hier ist der Code ich verwende:GetProcessTimes unter Windows ist unpräzise

void getCPUtime(unsigned long long *pUser, unsigned long long *pKernel) { 
    FILETIME user, kernel, exit, start; 
    ULARGE_INTEGER userCPU, kernelCPU; 
    if (::GetProcessTimes(::GetCurrentProcess(), &start, &exit, &kernel, &user) != 0) { 
     userCPU.LowPart = user.dwLowDateTime; 
     userCPU.HighPart = user.dwHighDateTime; 
     kernelCPU.LowPart = kernel.dwLowDateTime; 
     kernelCPU.HighPart = kernel.dwHighDateTime; 
    } 
    *pUser = (unsigned long long)userCPU.QuadPart; 
    *pKernel = (unsigned long long)kernelCPU.QuadPart; 
} 

Und ich rufe aus:

void someFunction() { 
    unsigned long long *userStartCPU, *userEndCPU, *kernelStartCPU, *kernelEndCPU; 
    double userCPUTime, kernelCPUTime; 

    getCPUtime(userStartCPU, kernelStartCPU); 

// Do stuff which takes longer than a millisecond 

    getCPUtime(userEndCPU, kernelEndCPU); 

    userCPUTime = (userEndCPU - userStartCPU)/(double)10000.00; // Convert to milliseconds 
    kernelCPUTime = (kernelEndCPU - kernelStartCPU)/(double)10000.00; // Convert to milliseconds 
} 

Weiß jemand, warum dies geschieht, oder hat andere Art und Weise präzise CPU-Zeit auf Windows zu messen ?

+0

Siehe anwer http://stackoverflow.com/questions/1739259/how-to-use-queryperformancecounter – lsalamon

+0

„On MSDN sagt, dass die Genauigkeit der zurückgegebenen CPU-Zeit 100 Nanosekunden ist. " Nein, das sagt es nicht. Es besagt, dass die Auflösung 100 Nanosekunden beträgt. Das bedeutet, dass die Genauigkeit _bei besten_ 100 Nanosekunden ist, aber das ist nur eine untere Grenze, wie Sie entdeckt haben. – MSalters

+0

@MSalters Also ist es wegen meiner Maschine oder OS, dass ich diese niedrige Präzision bekomme? QueryPerformanceCounter ist jedoch sehr präzise. – ZrtvenoJagnje

Antwort

0

MSDN hat this Seite, die mit einem hochauflösenden Zeitgeber skizziert.

Ich würde empfehlen, Google Benchmark] 2. Mit Blick auf die Windows specific Code, müssen Sie double anstelle von ganzen Zahlen verwenden, wie in der Funktion MakeTime verwendet here

dieses
+0

@crezfire Ich verwende den QueryPerformanceCounter, aber es misst die Wandzeit. Ich muss die CPU-Zeit messen, und auf [GetProcessTimes] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683223 (v = vs.85) .aspx) heißt es, dass die die Präzision beträgt 100 Nanosekunden. – ZrtvenoJagnje

+0

@ZrtvenoJagnje Die Frage wurde aktualisiert, um Codebeispiele von Google Benchmark aufzunehmen – crezefire