使用GetProcessTimes在Windows上测量CPU时间

我想测量一些函数的CPU时间。 我知道如何使用GetProcessTimes ,但我有一个问题,实施一些'重新启动':

通常情况下,我会这样做:

 #include "stdafx.h" #include <math.h> #include <windows.h> double cputimer() { FILETIME createTime; FILETIME exitTime; FILETIME kernelTime; FILETIME userTime; if ( GetProcessTimes( GetCurrentProcess( ), &createTime, &exitTime, &kernelTime, &userTime ) != -1 ) { SYSTEMTIME userSystemTime; if ( FileTimeToSystemTime( &userTime, &userSystemTime ) != -1 ) return (double)userSystemTime.wHour * 3600.0 + (double)userSystemTime.wMinute * 60.0 + (double)userSystemTime.wSecond + (double)userSystemTime.wMilliseconds / 1000.0; } } int _tmain(int argc, _TCHAR* argv[]) { double start, stop; long sum = 0L; start = cputimer(); for (long long i = 1; i < 10000000; i++){ sum += log((double)i); } stop = cputimer(); printf("Time taken: %f [seconds]\n", stop - start); return 0; } 

但“重置”,我不知道我是否有正确的结果:

 #include "stdafx.h" #include <math.h> #include <windows.h> #define START 1 #define STOP 0 double cputimer(int reset) { FILETIME createTime; FILETIME exitTime; FILETIME kernelTime; FILETIME userTime; double now = 0, then = 0; if ( GetProcessTimes( GetCurrentProcess( ), &createTime, &exitTime, &kernelTime, &userTime ) != -1 ) { SYSTEMTIME userSystemTime; if ( FileTimeToSystemTime( &userTime, &userSystemTime ) != -1 ) now = (double)userSystemTime.wHour * 3600.0 + (double)userSystemTime.wMinute * 60.0 + (double)userSystemTime.wSecond + (double)userSystemTime.wMilliseconds / 1000.0; } if(reset) { then = now; } else { then = now - then; } return then; } int _tmain(int argc, _TCHAR* argv[]) { double s; long sum = 0L; cputimer(START); for (long long i = 1; i < 10000000; i++){ sum += log((double)i); } s = cputimer(STOP); printf("Time taken: %f [seconds]\n", s); return 0; } 

我做得对吗?

Solutions Collecting From Web of "使用GetProcessTimes在Windows上测量CPU时间"

我建议你在Windows上使用更简单的解决方案,如果你的过程不会运行太久:

 #define WIN32_LEAN_AND_MEAN #include <windows.h> double getTime() { LARGE_INTEGER freq, val; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&val); return (double)val.QuadPart / (double)freq.QuadPart; } 

那么你可以像这样使用它:

 double d0 = getTime(); // function to measure double timeInMilliseconds = 1000* (getTime() - d0); 

你可以把这个包装成一个函数来实现和你的代码类似的行为。

 double cputimer(int reset) { static double startTime = 0; if(reset) { startTime = getTime(); return 0.0; } else { return 1000* (getTime() - startTime); } } 

更新:如果真正的意图是查询使用时间,应该替换getTime()函数(使用OP),但cputimer()的逻辑保持不变。