使用clock_gettime()的正确方法是什么?

2024-02-11

我在 C 程序中尝试这个函数,它总是打印错误的时间。这是我目前的代码:

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/resource.h>

int main( int argc, char **argv ){
    struct timespec start, finish;
    clock_gettime( CLOCK_REALTIME, &start );
    sleep( 1 );
    clock_gettime( CLOCK_REALTIME, &finish );
    printf( "%f\n", ((double) (finish.tv_nsec - start.tv_nsec))/((double) 100000) );
    return 0;
}

我不确定这是否是转换为舍入错误时导致的异常double或者如果我正在使用clock_gettime()功能不正确,但我期望它输出 1 秒,结果却输出 1.27 秒。


您需要考虑tv_sec计算返回的两个值之间的时间差时的结构成员clock_gettime() http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_gettime.html.

The tv_nsec是当前秒内的纳秒数。它的范围(理论上)在 0 到 999,999,999 之间。这允许将整数秒存储在tv_sec和一小部分秒被存储在tv_nsec。实际分辨率是另一个问题:参见clock_getres() http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html为了那个原因。例如,在 Mac 上,分辨率为微秒,尽管它们以纳秒表示。

考虑使用这样的代码:

#include <stdio.h>
#include <time.h>
#include <unistd.h>

enum { NS_PER_SECOND = 1000000000 };

void sub_timespec(struct timespec t1, struct timespec t2, struct timespec *td)
{
    td->tv_nsec = t2.tv_nsec - t1.tv_nsec;
    td->tv_sec  = t2.tv_sec - t1.tv_sec;
    if (td->tv_sec > 0 && td->tv_nsec < 0)
    {
        td->tv_nsec += NS_PER_SECOND;
        td->tv_sec--;
    }
    else if (td->tv_sec < 0 && td->tv_nsec > 0)
    {
        td->tv_nsec -= NS_PER_SECOND;
        td->tv_sec++;
    }
}

int main(void)
{
    struct timespec start, finish, delta;
    clock_gettime(CLOCK_REALTIME, &start);
    sleep(1);
    clock_gettime(CLOCK_REALTIME, &finish);
    sub_timespec(start, finish, &delta);
    printf("%d.%.9ld\n", (int)delta.tv_sec, delta.tv_nsec);
    return 0;
}

运行时(如cgt61),我得到的结果如下:

$ cgt61
1.004930000
$ cgt61
1.004625000
$ cgt61
1.003023000
$ cgt61
1.003343000
$

这是在 Mac 上测试的;您可以看到最后三位数字始终为零。在 Linux VM(Mac 上的 Ubuntu 18.04)中,我必须添加#define _POSIX_C_SOURCE 200809L到代码(因为我用-std=c11;如果我用过-std=gnu11,我本来就可以),输出是:

$ ./cgt61
1.000589528
$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用clock_gettime()的正确方法是什么? 的相关文章