c timeval vs timespec

时间:2015-07-07 17:10:05

标签: c linux time

除了精确度的差异之外,struct timevalstruct timespec之间有什么区别?如果我需要的精度低于μs(比如毫秒),为什么我会使用一个而不是另一个呢?

在我的编译器(ARM的gcc)上:

/* POSIX.1b structure for a time value.  This is like a `struct timeval' but
   has nanoseconds instead of microseconds.  */
struct timespec
  {
    __time_t tv_sec;        /* Seconds.  */
    __syscall_slong_t tv_nsec;  /* Nanoseconds.  */
  };

/* A time value that is accurate to the nearest
   microsecond but also has a range of years.  */
struct timeval
  {
    __time_t tv_sec;        /* Seconds.  */
    __suseconds_t tv_usec;  /* Microseconds.  */
  };

__syscall_slong_t__suseconds_t定义为“长字”。

3 个答案:

答案 0 :(得分:14)

我认为这只是API [in]兼容性的问题。 POSIX-y调用pselect()clock_gettime()使用struct timespec。各种文件系统调用如utimes(),以及一些类似Linux调用,如gettimeofday()select(),使用struct timeval。从一些手册页大致概括,我怀疑struct timeval有BSD遗产,而struct timespec是POSIX。

如果您正在进行间隔测量,则没有理由不利用clock_gettime()的额外精度 - 但要注意它通常是硬件,而不是头文件,这会限制您的测量精度。为显示目的除以一百万不是更好或更差,而不是一千。另外,Mac OS X does not support clock_gettime()

但是如果你正在进行大量的文件时间操作,那么使用像struct timeval这样的API中使用的utimes()可能会更有意义。 struct timeval在Linux,BSD和Mac OS X上也有一些比较功能,例如timercmp()timersub()(再次参阅手册页)。

我会根据您打算使用的API做出决定,而不是根据结构本身做出决定。 (或者,如果需要,可以使用转换方法编写包装类。)

答案 1 :(得分:3)

两者都是为POSIX.1-2001定义的AFAIK,因此从可移植性的角度来看,使用哪一个并不重要。最简单的答案是:使用您打算调用的API。

使用struct timeval

可能会产生与平台相关的大小优势
  

suseconds_t类型应为有符号整数类型   能够存储至少在[-1,1000000]范围内的值。

struct timespec中,第二个成员的类型为long。在32位平台上int就足以满足suseconds_t要求。但是,在64位系统上,time_t通常为64位,因此无论如何都迫使结构填充到16个字节。所以规模效益是 - 不太可能。

答案 2 :(得分:1)

就个人而言,我没有使用任何一个。我更喜欢将时间表示为一个简单的int64_t,因为这会使时间计算变得简单,如果必须,转换回struct timevalstruct timespec也没有问题。即使你想要一个纳秒的精度,int64_t也可以表达近585年的跨度。如果你只需要几毫秒,你就有超过5.85亿年的时间。