usleepの精度

Linuxのスリープ関数の精度を試してみた。
sleep(sec)、usleep(usec)、nanosleep(nsec)とある。
まずはusleep。

検証プログラム
#include <stdio.h>
#include <unistd.h>

double get_time_sec(){
  struct timeval tv;
  gettimeofday(&tv, NULL);
  return tv.tv_sec + (double)tv.tv_usec*1e-6;
}

int main(){
  int i;
  puts("    指定       停止       誤差");
  for(i=1;i<10e6;i*=10){
    double start,end;

    start = get_time_sec();
    usleep(i);
    end = get_time_sec();

    printf("%f : %f : %f sec\n", i/1.0e6, end - start, end - start - i/1.0e6);
  }

  return 0;
}

実行結果

MacBook
air:timer mikeda$ ./usleep_check 
    指定       停止       誤差
0.000001 : 0.000054 : 0.000053 sec
0.000010 : 0.000024 : 0.000014 sec
0.000100 : 0.000184 : 0.000084 sec
0.001000 : 0.001125 : 0.000125 sec
0.010000 : 0.010115 : 0.000115 sec
0.100000 : 0.100159 : 0.000159 sec
1.000000 : 1.000100 : 0.000100 sec

Linux
[mikeda@cent c]$ ./usleep_check 
    指定       停止       誤差
0.000001 : 0.001694 : 0.001693 sec
0.000010 : 0.001863 : 0.001853 sec
0.000100 : 0.001938 : 0.001838 sec
0.001000 : 0.002940 : 0.001940 sec
0.010000 : 0.011939 : 0.001939 sec
0.100000 : 0.101921 : 0.001921 sec
1.000000 : 1.001793 : 0.001793 sec


MacBookが思ったより精度いい!
(でもMacBookでよくても意味がないんだ!)


Linuxのタイマー割込精度の問題でmsec単位で誤差が出てくるらしい。
またnanosleep、タイマ割込を試した結果ものせます。