除了精确度的差异之外,struct timeval
和struct 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
定义为“长字”。
答案 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 timeval
或struct timespec
也没有问题。即使你想要一个纳秒的精度,int64_t
也可以表达近585年的跨度。如果你只需要几毫秒,你就有超过5.85亿年的时间。