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_MONOTONICCLOCK_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 などの読み取り操作にかかる高コストのハードウェアクロックを使用するシステムにおいて、より明確になります。