除了精度上的不同,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都被定义为“长词”。
发布于 2015-07-08 01:31:00
我认为这实际上只是一个API不兼容的问题。pselect()和clock_gettime()等POSIX-y调用使用struct timespec。像utimes()这样的各种文件系统调用,以及像gettimeofday()和select()这样的各种Linux调用,都使用struct timeval。从几个手册页可以大致概括一下,我怀疑struct timeval具有BSD传统,而struct timespec是POSIX。
如果您正在进行间隔测量,那么没有理由不利用clock_gettime()的额外精度-尽管要注意,通常是硬件而不是头文件限制了您的测量精度。出于显示目的,除以一百万并不比除以一千更好或更差。还有,Mac OS X does not support clock_gettime()。
但是,如果您正在进行大量的文件时间操作,那么使用utimes()等API中使用的struct timeval可能更有意义。struct timeval在Linux、BSD和Mac上也有一些比较功能,例如timercmp()、timersub() (同样,请参阅手册页)。
我会根据您打算使用的API做出决定,而不是根据结构本身。(如果需要,也可以编写一个带有转换方法的包装类。)
发布于 2015-07-08 01:31:09
两者都是为POSIX.1-2001定义的AFAIK,因此从可移植性的角度来看,使用哪一个并不重要。最简单的答案是:对于您想要调用的API,使用您需要的任何一个。
使用struct timeval可能会带来与平台相关的大小优势
类型suseconds_t应为带符号整数类型,至少能够存储-1,1000000范围内的值。
在struct timespec中,第二个成员的类型为long。在32位平台上,一个int就足以满足suseconds_t要求。但是,在64位系统上,time_t通常是64位的,因此强制结构填充到16字节。因此,尺寸优势是--不太可能的。
发布于 2017-11-19 10:53:27
就我个人而言,我两个都不用。我更喜欢用一个简单的int64_t来表示时间,因为这使得时间计算变得非常简单,如果必须的话,转换回struct timeval或struct timespec也不成问题。即使您想要纳秒的精度,int64_t也可以表示近585年的跨度。如果你只需要几毫秒,你就有将近5.85亿年的时间跨度。
https://stackoverflow.com/questions/31275131
复制相似问题