使用 GetProcessTimes 测量 Windows 上的 CPU 时间
Measure CPU time on Windows using GetProcessTimes
我想测量某个函数的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;
}
我做得对吗?
如果你的进程没有运行太长时间,我建议你在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()
中的逻辑保持不变。
相关文章:
- 分别测量每个线程上花费的 CPU 时间(C++)
- 超过CPU时间限制:当MPI_Sent一个非常大的int*时
- 如何测量一组特定线程的 CPU 时间?
- 如何以C++而不是 CPU 时间测量挂钟时间
- 将返回 CPU 时间提升为 0
- C++中的双感叹号(!!)会花费更多的CPU时间吗
- 即使使用睡眠,线程也不会放弃CPU时间
- 以C++为单位测量程序的 CPU 时间和挂钟时间
- 在 Windows 上以C++计算 CPU 时间
- 时间短函数与 CPU 时间使用 RTEMS 操作系统
- PDH 无法通过 PdhAddCounter() 访问总 CPU 时间
- 二叉搜索真的是在 0 时钟 CPU 时间内执行的吗?
- 我应该检查什么:cpu时间还是墙时间
- 使用MPI时计算CPU时间
- 堆排序CPU时间
- rusage的进程/线程的Cpu时间不可能
- 如何在 Windows 上以 C++ 为单位测量 CPU 时间并包括 system() 的调用
- 在 Ubuntu 中获取 CPU 时间
- 为什么使用 clock() 在测量 CPU 时间时得到减号
- 使用 GetProcessTimes 测量 Windows 上的 CPU 时间