CPU 时间测量

CPU time measurement

本文关键字:测量 时间 CPU      更新时间:2023-10-16

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

我认为这不是以毫秒为单位的正确时间值。谁能帮忙这里出了什么问题?

任何帮助将不胜感激。

谢谢

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

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()系统调用。

如果需要 CPU 时间,您可能希望将 clock_gettimeCLOCK_PROCESS_CPUTIME_ID 参数一起使用。

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

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

Alnitak 答案的一个小补充:

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

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

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

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