CPU时间测量

时间:2012-04-30 08:30:54

标签: c++ c linux timing

我有以下代码片段,我正在尝试评估CPU占用的时间

但是我得到了一些奇怪的结果

struct timeval begin, end;
double cpu_time=0.0;
gettimeofday(&begin, NULL);
long cpu_sum = 0;


for (i = 0; i < size; i++) {
 cpu_sum += array[i] * array[i];
}    
 gettimeofday(&end, NULL);
 cpu_time = end.tv_sec - begin.tv_sec * 1000;
 cpu_time += (end.tv_usec - begin.tv_usec) / 1000;

 printf("calculated sum: %d using CPU in %lf ms \n", cpu_sum, cpu_time);

样本结果= 1296217442.000000 ms

我不认为这是以ms为单位的正确时间值。 任何人都可以帮忙解决这个问题吗?

任何帮助将不胜感激。

由于

4 个答案:

答案 0 :(得分:13)

您需要修正运营商优先级:

cpu_time = (end.tv_sec - begin.tv_sec) * 1000;
cpu_time += (end.tv_usec - begin.tv_usec) / 1000;

在原始文件中,您将begin.tv_sec乘以1000,然后end.tv_sec中减去该值;

此外,并非gettimeofday()测量“挂钟时间”,而不是严格的CPU时间,后者是衡量该过程“CPU工作量”的更好指标。如果另一个进程与您同时使用CPU,则结果将不准确。

对于“正确”的CPU时间,您应该使用(POSIX标准)getrusage()系统调用。

答案 1 :(得分:1)

如果您想要 CPU 时间,您可能希望使用clock_gettime代替CLOCK_PROCESS_CPUTIME_ID参数。

这是使用相同功能获得实时和cpu时间的最方便(和最准确)的方法,只改变一个参数。

答案 2 :(得分:1)

Pentium class cpu有一条指令将当前时间戳计数器变量(64位变量)读入寄存器(edx:eax)。如果你想获得真正的CPU时间,你可以使用这个指令。你可以可以得到CPU滴答。 详情......请链接此链接。 rdtsc

答案 3 :(得分:0)

Alnitak答案的一小部分内容:

您将cpu_time定义为double,我认为这是为了处理可能的溢出(运行时间大于~2M秒)。 但是在行中:

cpu_time = (end.tv_sec - begin.tv_sec) * 1000;

右侧被评估为unsigned integer,并在大约4M秒后溢出。之后将其分配给double将无济于事 因此,如果您真的关心长时间运行,请执行以下操作:

cpu_time = (double)(end.tv_sec - begin.tv_sec) * 1000;