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、タイマ割込を試した結果ものせます。