当我为gettimeofday()输出微秒字段时,我注意到微秒字段大于1,000,000。有人知道这是为什么吗?这是否意味着我对gettimeofday()的解释是错误的?
根据记录,我假设根据gettimeofday()的当前时间(以微秒为单位)如下:
struct timeval ts;
gettimeofday(&ts, NULL);
printf("%zu", ts.tv_sec * 1000000 + ts.tv_usec);编辑:这是导致问题的代码。在下面的注释之后,printf()可能有问题。
struct timeval curr_time;
gettimeofday(&curr_time, NULL);
printf("Done-arino! Onto the matrix multiplication (at %zu s, %03zu ms)\n", curr_time.tv_sec, curr_time.tv_usec);
// Matrix Multiplication
struct timeval start_tv, end_tv, elapsed_tv;
gettimeofday(&start_tv, NULL);
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
for (k = 0; k < N; k++)
C[i][j] += A[i][k] * B[k][j];
gettimeofday(&end_tv, NULL);
timersub(&end_tv, &start_tv, &elapsed_tv);
// Print results
printf("Elapsed time: %zu s, %03zu ms\n", elapsed_tv.tv_sec, elapsed_tv.tv_usec / 1000);发布于 2018-05-27 07:04:14
在gettimeofday成功之后,是的,tv_usec被保证严格小于1000000。
如果你(认为你)看到的值是1000000或更大,那么是的,你很可能做错了什么。
一个常见的错误是天真地添加或减去两个struct timeval值,而没有在tv_sec和tv_usec字段之间实现适当的进位或借用,这很容易导致tv_usec中的值大于1000000 (错误和错误)。(在你编辑的帖子中,你提到了减去timespecs,但你使用的是系统提供的timersub函数,它应该获得借阅权。)
如果您使用的是struct timespec而不是struct timeval,并且持续了一秒钟,并且您正在(奇迹般地)使用实现了https://www.cl.cam.ac.uk/~mgk25/posix-clocks.html的Markus Kuhn提出的CLOCK_UTC时钟类型的OS内核,您将看到tv_nsec值大于1000000000,但这是很多“if”。(据我所知,广泛使用的内核都没有实现过CLOCK_UTC。)
发布于 2018-05-27 07:36:59
您的printf格式可疑,可能会导致此问题。
%zu格式用于打印size_t值。但是tv_sec和tv_usec都没有size_t类型。
在现代系统中,size_t可能是64位的。但是,如果tv_sec或tv_usec都不是,printf将错误地打印这些值。
我把你的printf%s改成了
printf("Done-arino! Onto the matrix multiplication (at %ld s, %03u ms)\n",
curr_time.tv_sec, curr_time.tv_usec);和
printf("Elapsed time: %ld s, %03u ms\n",
elapsed_tv.tv_sec, elapsed_tv.tv_usec / 1000);但是,这些不一定适合您--这取决于您的系统对tv_sec和tv_usec的具体选择。
https://stackoverflow.com/questions/50547661
复制相似问题