clock_gettime(clock_id, unit=:float_second) -> Float | Integer
[permalink][rdoc]POSIX の clock_gettime() 関数の時間を返します。
例:
p Process.clock_gettime(Process::CLOCK_MONOTONIC) #=> 896053.968060096
SUSv2 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 2.1, macOS 10.12
SUSv3 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4, macOS 10.12
SUSv3 to 4, Linux 2.5.63, OpenBSD 5.4, macOS 10.12
SUSv3 to 4, Linux 2.5.63, FreeBSD 7.1, OpenBSD 5.4, macOS 10.12
FreeBSD 3.0, OpenBSD 2.1
FreeBSD 3.0, OpenBSD 2.1
FreeBSD 8.1
FreeBSD 8.1
Linux 2.6.32
Linux 3.0
FreeBSD 8.1
FreeBSD 8.1
Linux 2.6.32
Linux 2.6.28, macOS 10.12
macOS 10.12
Linux 2.6.39
Linux 3.0
FreeBSD 7.0, OpenBSD 5.5
FreeBSD 8.1
macOS 10.12
macOS 10.12
FreeBSD 8.1
FreeBSD 8.1
SUS は Single Unix Specification を意味しており、 SUS は POSIX と POSIX の一部で定義されている clock_gettime を含みます。 SUS では CLOCK_REALTIME は必須ですが、CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID は任意です。
さらに clock_id はいくつかのシンボルを受け付けます。それらは clock_gettime() をエミュレーションします。
たとえば、Process::CLOCK_REALTIME は clock_gettime() がない場合は :GETTIMEOFDAY_BASED_CLOCK_REALTIME と定義されています。
CLOCK_REALTIME のエミュレーション:
SUS で定義されている gettimeofday() を使います。 (しかし SUSv4 で obsoleted になっています) 精度は1マイクロ秒です。
ISO C で定義されている time() を使います。精度は1秒です。
CLOCK_MONOTONIC のエミュレーション:
Darwin で利用可能な mach_absolute_time() を使います。精度は CPU に依存します。
POSIX で定義されている times() の結果を使います。 POSIX では「times() は過去のある時点 (例えばシステムの起動時刻) からの経過クロック数 (clock tick) で実際に経過時間を返します」と定義されています。例えば GNU/Linux では jiffies に基づいた値を返し、monotonic (単調増加が保証されていて、巻き戻ったりしない) です。しかし 4.4BSD では gettimeofday() を使い、monotonic ではありません。 (ただし FreeBSD では clock_gettime(CLOCK_MONOTONIC) を代わりに使います。) 精度はクロック数 (clock tick) です。「getconf CLK_TCK」コマンドで1秒あたりのクロック数を表示できます。 (古いシステムでは、1秒あたりのクロック数は HZ マクロで定義されています。) もし1秒あたりのクロック数が 100 かつ clock_t が32ビット整数型の場合、精度は10ミリ秒で497日以上を表すことはできません。
CLOCK_PROCESS_CPUTIME_ID のエミュレーション:
SUS で定義されている getrusage() を使います。 getrusage() を RUSAGE_SELF と一緒に使うと、(子プロセスの時間をのぞいた) getrusage() を呼び出したプロセスだけの CPU 時間が得られます。ユーザー時間 (ru_utime) とシステム時間 (ru_stime) を足した結果を返します。精度は1マイクロ秒です。
POSIX で定義されている times() を使います。ユーザー時間 (tms_utime) と システム時間 (tms_stime) を足した結果を返します。 tms_cutime と tms_cstime は子プロセスの時間を含みません。精度はクロック数 (clock tick) です。「getconf CLK_TCK」コマンドで1秒あたりのクロック数を表示できます。 (古いシステムでは、1秒あたりのクロック数は HZ マクロで定義されています。) もし1秒あたりのクロック数が100なら、精度は10ミリ秒です。
ISO C で定義されている clock() を使います。精度は 1/CLOCKS_PER_SEC です。 CLOCKS_PER_SEC は time.h で定義されているC言語のマクロです。 SUS では CLOCKS_PER_SEC は 1000000 と定義されています。ただし、Unix 以外のシステムでは異なる値に定義されているかもしれません。 SUS で定義されているように CLOCKS_PER_SEC が 1000000 なら、精度は1マイクロ秒です。 CLOCKS_PER_SEC が 1000000 かつ clock_t が32ビット整数型の場合、72分以上を表すことはできません。
Float の秒 (デフォルト)
Float のミリ秒
Float のマイクロ秒
Integer の秒
Integer のミリ秒
Integer のマイクロ秒
Integer のナノ秒
基になる関数 clock_gettime() はナノ秒を返します。 Float オブジェクト (IEEE 754 double) は CLOCK_REALTIME の結果を表すには不十分です。正確なナノ秒が必要なら、unit に :nanosecond を使ってください。
返値のオリジン(0)は様々です。例えば、システムの起動時刻、プロセス起動時刻、エポックなどです。
CLOCK_REALTIME のオリジンはエポック (1970-01-01 00:00:00 UTC) と定義されています。しかし、システムによってうるう秒をカウントするかどうかが異なります。そのため、結果はシステムによって解釈が異なります。 CLOCK_REALTIME よりも Time.now をおすすめします。
[SEE_ALSO] Time.now