除了精度的差异,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定义为“长字”.
解决方法
我认为这只是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()
.
但是如果你正在进行大量的文件时间操作,那么使用像utimes()这样的API中使用的struct timeval可能更有意义. struct timeval在Linux,BSD和Mac OS X上也有一些比较功能,例如: timercmp(),timersub()(再次参见手册页).
我会根据您打算使用的API做出决定,而不是根据结构本身做出决定. (或者,如果需要,可以使用转换方法编写包装类.)