在Linux和OS X上的ns精度单调时钟

clock_gettime(CLOCK_MONOTONIC, ...)可以在Linux中使用,但不能在OS X上使用clock_gettime(CLOCK_MONOTONIC, ...)计时器在OS X中可用,但在Linux中不可用。

我怎样才能得到一个ns的精度单调时钟在C和Linux和OS X的作品?

Solutions Collecting From Web of "在Linux和OS X上的ns精度单调时钟"

 /* This is based on the snippet current_utc_time.c from: https://gist.github.com/jbenet/1087739 On OS X, compile with: gcc get_monotonic_time.c Linux, compile with: gcc get_monotonic_time.c -lrt */ #include <time.h> #include <sys/time.h> #include <stdio.h> #ifdef __MACH__ #include <mach/clock.h> #include <mach/mach.h> #endif // Use clock_gettime in linux, clock_get_time in OS X. void get_monotonic_time(struct timespec *ts){ #ifdef __MACH__ clock_serv_t cclock; mach_timespec_t mts; host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); ts->tv_sec = mts.tv_sec; ts->tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, ts); #endif } double get_elapsed_time(struct timespec *before, struct timespec *after){ double deltat_s = after->tv_sec - before->tv_sec; double deltat_ns = after->tv_nsec - before->tv_nsec; return deltat_s + deltat_ns*1e-9; } int main(){ // Do something and time how long it takes. struct timespec before, after; get_monotonic_time(&before); double sum=0.; unsigned u; for(u=1; u<100000000; u++) sum += 1./u/u; get_monotonic_time(&after); printf("sum = %e\n", sum); printf("deltaT = %es\n", get_elapsed_time(&before,&after)); } 

我用道格拉斯的答案(接受的答案),他的参考文献和其他在互联网上浮动的例子(如这个问题 )。

这个答案是包含我模拟CLOCK_REALTIMECLOCK_MONOTONICclock_gettime的代码版本 。 它也模拟函数clock_nanosleep()的绝对单调时间。 代码托管在GitHub 这里 。

为了工作,你的代码中唯一需要的位是

 #ifdef __MACH__ timing_mach_init(); #endif 

然后使用clock_gettime()clock_nanosleep_abstime() ,就好像您使用的是一个实际上符合POSIX(具有实时扩展)的系统。