使用GetProcessTimes在Windows上测量CPU时间

时间:2013-10-15 10:23:41

标签: c++ c windows timer 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;
}

我是否正确地做到了?

2 个答案:

答案 0 :(得分:2)

如果您的流程运行时间过长,我建议您在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);
  }
}

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

答案 1 :(得分:0)

两个函数的失败返回值是0,而不是-1。