1

我有以下代码片段,我正在尝试评估 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 毫秒

我不认为这是以毫秒为单位的正确时间值。任何人都可以帮助这里有什么问题吗?

任何帮助,将不胜感激。

谢谢

4

4 回答 4

13

您需要修复运算符优先级:

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

在原始文件中,您乘以begin.tv_sec1000,然后从中减去end.tv_sec

此外,不是gettimeofday()衡量“挂钟时间”,而不是严格意义上的 CPU 时间,后者是衡量进程花费多少“CPU 工作量”的更好衡量标准。如果另一个进程与您的进程同时使用 CPU,那么结果将不准确。

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

于 2012-04-30T08:32:59.967 回答
1

如果你想要CPU时间,你可能想用参数来clock_gettime代替CLOCK_PROCESS_CPUTIME_ID

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

于 2012-04-30T08:50:06.730 回答
1

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

于 2012-05-07T16:54:21.520 回答
0

Alnitak 回答的一个小补充:

您定义cpu_timedouble,我假设它是为了处理可能的溢出(运行时间大于~2M 秒)。但在这条线上:

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

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

cpu_time = (double)(end.tv_sec - begin.tv_sec) * 1000;
于 2012-04-30T10:25:38.737 回答