CPU 时间测量
CPU time measurement
我有以下代码片段,我正在尝试评估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_gettime
与 CLOCK_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;
相关文章:
- 用时钟测量程序的运行时间
- 为什么根据测量位置测量经过的时间时会有很大的不同?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 分别测量每个线程上花费的 CPU 时间(C++)
- 测量时间以在 c++ 中生成更好的随机数
- 给定使用 C++ 或 C,我如何测量在 linux 下进行线程切换需要多长时间?可能吗?
- Linux 测量时间问题! std::chrono, QueryPerformanceCounter, clock_ge
- 以相同的结果测量时间
- 在IF语句C 中测量时间
- 当我使用 cin 时,我如何使用 clock() 测量时间
- 在 GPU 上测量时间
- C++精确测量时间,单位为十进制毫秒
- 有没有办法在Windows上测量时间到微秒的精度
- 用C++测量时间
- 测量时间以执行简单的指令
- c++时钟测量时间不正确
- 为Windows c++测量时间,毫秒或微秒
- 获取CPU节拍和测量时间
- C 如何在 <time.h 中测量时间>
- 用c++语言测量时间,精度高