【问题标题】:Granularity in time function时间函数的粒度
【发布时间】:2011-06-14 03:32:35
【问题描述】:

有没有办法检查POSIX提供的gettimeofday()函数的粒度?

【问题讨论】:

  • 我不清楚你的问题:根据标准,分辨率以微秒为单位 - “gettimeofday() 函数应获取当前时间,表示为自纪元以来的秒数和微秒数”你问是否有检查系统时钟的分辨率是否小于一微秒的编程方式?
  • @RomanK:分辨率和粒度不是一回事。 POSIX 确实指定了微秒,但在给定的实现中,这些微秒可能一次只增加例如 1000。

标签: c posix


【解决方案1】:

考虑使用clock_gettime()(指定CLOCK_REALTIME 时钟),而不是gettimeofday()。这也是POSIX,支持clock_getres()函数获取分辨率。

【讨论】:

  • 但是clock_getres 总是为 hrtimers 返回 1 ns 而不是真正的计时器分辨率....
【解决方案2】:

在一个紧密的循环中调用它,当它改变时注意当前值和前一个值之间的差异。类似于以下内容:

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

int main()
{
        struct timeval timevals[2];
        int cur = 0;
        while (1) {
                gettimeofday(&timevals[cur], NULL);
                int diff = timevals[cur].tv_usec - timevals[!cur].tv_usec;
                if (diff)
                        printf("%d\n", diff);
                cur = !cur;
        }
}

在我的系统上,粒度似乎约为 2 微秒(大约 50/50 一或两微秒,可能由于任务切换而导致成百上千的异常值)。

【讨论】:

  • 您高估了延迟,因为您也在计算格式化差异所花费的时间。您应该在cur = !cur; 行之后立即调用gettimeofday(&amp;timevals[!cur], NULL);,以便最小化调用之间的间隔。您可能会发现结果通常为零 - 因为您的机器足够快,可以在一微秒内进行两次 gettimeofday() 调用。别忘了,如果你的 CPU 运行在 3 GHz,那么一微秒就是 3000 个时钟周期;你可以在 3000 个时钟周期内做很多事情。
【解决方案3】:

目前获取gettimeofday()的posix方法是

#include <unistd.h>
long ticks_per_sec = sysconf(_SC_CLK_TCK);

在较旧的 posix 版本中(不确定更改发生的时间),值 CLOCKS_PER_SEC 是#defined。

【讨论】:

  • CLOCKS_PER_SEC 是标准 C,适用于 clock()_SC_CLK_TCK 适用于 times()。两者都不适用于gettimeofday()
猜你喜欢
  • 2023-04-11
  • 2013-05-20
  • 2018-04-24
  • 2019-01-21
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2019-09-12
相关资源
最近更新 更多