我有以下代码片段,我正在尝试评估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为单位的正确时间值。 任何人都可以帮忙解决这个问题吗?
任何帮助将不胜感激。
由于
答案 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;