15.2.3. C コードを使用したクロック解決の比較
以下のコードスニペットを使用すると、
CLOCK_MONOTONIC
POSIX クロックから読み取られたデータの形式を確認できます。timespec 構造の tv_nsec
フィールドにある 9 桁すべては、クロックにナノ秒の解像度があるため意味があります。clock_test.c
という名前のサンプル関数は、以下のようになります。
#include <stdio.h> #include <stdlib.h> #include <time.h> main() { int i; struct timespec ts; for(i=0; i<5; i++) { clock_gettime(CLOCK_MONOTONIC, &ts); printf("%ld.%ld\n", ts.tv_sec, ts.tv_nsec); usleep(200); } }
例15.4 clock_test.c
および clock_test_coarse.c
のサンプル出力
上記のコードで指定されるとおり、関数はクロックを 5 回読み取り、各読み取りごとに 200 マイクロ秒で読み取ります。
~]#gcc clock_test.c -o clock_test -lrt
~]#./clock_test
218449.986980853 218449.987330908 218449.987590716 218449.987849549 218449.988108248
同じソースコードを使用して、これを
clock_test_coarse.c
に変更し、 CLOCK_MONOTONIC
を CLOCK_MONOTONIC_COARSE
で置き換えることで、以下のような結果になります。
~]# ./clock_test_coarse
218550.844862154
218550.844862154
218550.844862154
218550.845862154
218550.845862154
_COARSE
クロックの精度は 1 ミリ秒であるため、timespec 構造の tv_nsec
フィールドの最初の 3 桁のみが重要になります。上記の結果は、以下のように読み込むことができます。
~]# ./clock_test_coarse
218550.844
218550.844
218550.844
218550.845
218550.845
POSIX クロックの
_COARSE
バリアントは、タイムスタンプをミリ秒単位で実行できる場合に特に便利です。この利点は、ACPI_PM などの読み取り操作にかかる高コストのハードウェアクロックを使用するシステムにおいて、より明確になります。