ns-precision monotonic clock in C on Linux and OS X

后端 未结 2 435
再見小時候
再見小時候 2021-01-06 10:38

clock_gettime(CLOCK_MONOTONIC, ...) is available in Linux but not OS X. The Mach timers are available in OS X but not in Linux.

How can I get a ns-preci

2条回答
  •  误落风尘
    2021-01-06 11:21

    /* 
    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 
    #include 
    #include 
    
    #ifdef __MACH__
    #include 
    #include 
    #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 = %e s\n", get_elapsed_time(&before,&after));
    
    }
    

提交回复
热议问题