首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gettimeofday()微秒,不限于秒以下

gettimeofday()微秒,不限于秒以下
EN

Stack Overflow用户
提问于 2018-05-27 06:59:49
回答 2查看 1.4K关注 0票数 1

当我为gettimeofday()输出微秒字段时,我注意到微秒字段大于1,000,000。有人知道这是为什么吗?这是否意味着我对gettimeofday()的解释是错误的?

根据记录,我假设根据gettimeofday()的当前时间(以微秒为单位)如下:

代码语言:javascript
复制
struct timeval ts;
gettimeofday(&ts, NULL); 
printf("%zu", ts.tv_sec * 1000000 + ts.tv_usec);

编辑:这是导致问题的代码。在下面的注释之后,printf()可能有问题。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2018-05-27 07:04:14

gettimeofday成功之后,是的,tv_usec被保证严格小于1000000。

如果你(认为你)看到的值是1000000或更大,那么是的,你很可能做错了什么。

一个常见的错误是天真地添加或减去两个struct timeval值,而没有在tv_sectv_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。)

票数 1
EN

Stack Overflow用户

发布于 2018-05-27 07:36:59

您的printf格式可疑,可能会导致此问题。

%zu格式用于打印size_t值。但是tv_sectv_usec都没有size_t类型。

在现代系统中,size_t可能是64位的。但是,如果tv_sectv_usec都不是,printf将错误地打印这些值。

我把你的printf%s改成了

代码语言:javascript
复制
printf("Done-arino! Onto the matrix multiplication (at %ld s, %03u ms)\n",
        curr_time.tv_sec, curr_time.tv_usec);

代码语言:javascript
复制
printf("Elapsed time: %ld s, %03u ms\n",
        elapsed_tv.tv_sec, elapsed_tv.tv_usec / 1000);

但是,这些不一定适合您--这取决于您的系统对tv_sectv_usec的具体选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50547661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档