c - gettimeofday() 微秒不限于秒以下

标签 c time gettimeofday

当我输出 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);

最佳答案

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

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

一个常见的错误是天真地添加或减去两个 struct timeval 值,而没有在 tv_sectv_usec 字段之间实现适当的进位或借位,这很容易导致(错误的)tv_usec 中的值大于 1000000。(在您编辑的帖子中,您提到减去时间规范,但您正在使用系统提供的 timersub 应该正确借用的函数。)

如果您使用 struct timespec 而不是 struct timeval,并且如果正在进行闰秒,并且如果 你(奇迹般地)使用了一个操作系统内核,该内核实现了 Markus Kuhn 在 https://www.cl.cam.ac.uk/~mgk25/posix-clocks.html 中提出的 CLOCK_UTC 时钟类型。 ,您会看到 tv_nsec 值大于 1000000000,但这是很多“if”。 (据我所知,广泛使用的内核还没有实现过 CLOCK_UTC。)

关于c - gettimeofday() 微秒不限于秒以下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547661/

相关文章:

C中的字符计数在输入字符后不会返回任何值

c - 如何捕获Control+D信号?

c - 读取文件并在结构数组中写入/排序

ios - 是否可以将 iOS 模拟器更改为使用 24 小时制?

c - 使用 timeval struct 和 gettimeofday 的奇怪错误——因为#define 中的分号

c - time() 和 gettimeofday() 返回不同的秒数

C 编程,如果 getchar 带有 _Bool

python - 从纪元到相对日期的秒数

php - 根据一天中的时间和星期几插入文本

c - 使用结构、引用和 gettimeofday 函数的一些帮助