来自mips路由器上clock_gettime()的纳秒

时间:2016-12-06 02:44:04

标签: c posix mips timing time.h

我试图在1GHz MIPS路由器上从CLOCK_REALTIME获得纳秒分辨率。当我为x86编译以下代码并在1GHz vm上运行时,我得到纳秒分辨率。当我编译mips并在1GHz路由器上运行时,它似乎会向上舍入到微秒。

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

int main(int argc, char **argv, char **arge) {
  struct timespec tps, tpe;
  if ((clock_gettime(CLOCK_REALTIME, &tps) != 0)
      || (clock_gettime(CLOCK_REALTIME, &tpe) != 0)) {
    perror("clock_gettime");
    return -1;
  }
  printf("%lu s, %lu ns\n", tpe.tv_sec-tps.tv_sec,
     tpe.tv_nsec-tps.tv_nsec);
  return 0;
}

以下是示例时间:

vagrant@vagrant-ubuntu-trusty-64:~$ gcc clock.c -o clock_x86 -static -lrt
vagrant@vagrant-ubuntu-trusty-64:~$ ./clock_x86
0 s, 221 ns


vagrant@vagrant-ubuntu-trusty-64:~$ mipsel-openwrt-linux-gcc clock.c -lrt -static -o clock_mips
<...scp...>
root@OpenWrt:~# ./clock_mips
0 s, 3000 ns

我对时钟,MIPS,处理器等有什么误解吗?无论处理器架构如何,我都希望调用CLOCK_REALTIME来产生纳秒粒度/分辨率。

此外,如果有人能够了解这些POSIX定时器的实现方式以及他们如何进行测量,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

clock_gettime支持的最小分辨率为纳秒。但无法保证系统时钟的分辨率(或实际上该功能的实现)将高于或低于该值。

致电clock_getres查询时钟的分辨率。

答案 1 :(得分:2)

时钟的保证粒度在POSIX.1-2008中指定为至少20ms。这是与密切相关的片段:

  

CLOCK_REALTIME和CLOCK_MONOTONIC时钟的最大允许分辨率以及基于这些时钟的所有时间服务由{_POSIX_CLOCKRES_MIN}表示,并且应定义为20 ms(1/50秒)。实现可以支持这些时钟的较小分辨率值,以提供更精细的粒度时基。使用clock_getres()函数获取特定时钟的实现所支持的实际分辨率。如果基于这些时钟之一的时间服务支持的实际分辨率与该时钟支持的分辨率不同,则实现应记录这种差异。

基本上,您需要调用clock_getres()来确定实现指定的解决方案实际上是什么。不要做任何假设它比20ms更精细的东西。