module function Process.#clock_gettime

clock_gettime(clock_id, unit=:float_second) -> Float | Integer[permalink][rdoc]

POSIX の clock_gettime() 関数の時間を返します。

例:

p Process.clock_gettime(Process::CLOCK_MONOTONIC) #=> 896053.968060096
[PARAM] clock_id:
クロックの種類を以下の定数のいずれかで指定します。サポートされている定数は OS やバージョンに依存します。
Process::CLOCK_REALTIME

SUSv2 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 2.1, macOS 10.12

Process::CLOCK_MONOTONIC

SUSv3 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4, macOS 10.12

Process::CLOCK_PROCESS_CPUTIME_ID

SUSv3 to 4, Linux 2.5.63, OpenBSD 5.4, macOS 10.12

Process::CLOCK_THREAD_CPUTIME_ID

SUSv3 to 4, Linux 2.5.63, FreeBSD 7.1, OpenBSD 5.4, macOS 10.12

Process::CLOCK_VIRTUAL

FreeBSD 3.0, OpenBSD 2.1

Process::CLOCK_PROF

FreeBSD 3.0, OpenBSD 2.1

Process::CLOCK_REALTIME_FAST

FreeBSD 8.1

Process::CLOCK_REALTIME_PRECISE

FreeBSD 8.1

Process::CLOCK_REALTIME_COARSE

Linux 2.6.32

Process::CLOCK_REALTIME_ALARM

Linux 3.0

Process::CLOCK_MONOTONIC_FAST

FreeBSD 8.1

Process::CLOCK_MONOTONIC_PRECISE

FreeBSD 8.1

Process::CLOCK_MONOTONIC_COARSE

Linux 2.6.32

Process::CLOCK_MONOTONIC_RAW

Linux 2.6.28, macOS 10.12

Process::CLOCK_MONOTONIC_RAW_APPROX

macOS 10.12

Process::CLOCK_BOOTTIME

Linux 2.6.39

Process::CLOCK_BOOTTIME_ALARM

Linux 3.0

Process::CLOCK_UPTIME

FreeBSD 7.0, OpenBSD 5.5

Process::CLOCK_UPTIME_FAST

FreeBSD 8.1

Process::CLOCK_UPTIME_RAW

macOS 10.12

Process::CLOCK_UPTIME_RAW_APPROX

macOS 10.12

Process::CLOCK_UPTIME_PRECISE

FreeBSD 8.1

Process::CLOCK_SECOND

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 のエミュレーション:

:GETTIMEOFDAY_BASED_CLOCK_REALTIME

SUS で定義されている gettimeofday() を使います。 (しかし SUSv4 で obsoleted になっています) 精度は1マイクロ秒です。

:TIME_BASED_CLOCK_REALTIME

ISO C で定義されている time() を使います。精度は1秒です。

CLOCK_MONOTONIC のエミュレーション:

:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC

Darwin で利用可能な mach_absolute_time() を使います。精度は CPU に依存します。

:TIMES_BASED_CLOCK_MONOTONIC

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 のエミュレーション:

:GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID

SUS で定義されている getrusage() を使います。 getrusage() を RUSAGE_SELF と一緒に使うと、(子プロセスの時間をのぞいた) getrusage() を呼び出したプロセスだけの CPU 時間が得られます。ユーザー時間 (ru_utime) とシステム時間 (ru_stime) を足した結果を返します。精度は1マイクロ秒です。

:TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID

POSIX で定義されている times() を使います。ユーザー時間 (tms_utime) と システム時間 (tms_stime) を足した結果を返します。 tms_cutime と tms_cstime は子プロセスの時間を含みません。精度はクロック数 (clock tick) です。「getconf CLK_TCK」コマンドで1秒あたりのクロック数を表示できます。 (古いシステムでは、1秒あたりのクロック数は HZ マクロで定義されています。) もし1秒あたりのクロック数が100なら、精度は10ミリ秒です。

:CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID

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分以上を表すことはできません。

[PARAM] unit:
返値の型を指定します。
:float_second

Float の秒 (デフォルト)

:float_millisecond

Float のミリ秒

:float_microsecond

Float のマイクロ秒

:second

Integer の秒

:millisecond

Integer のミリ秒

:microsecond

Integer のマイクロ秒

:nanosecond

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 をおすすめします。

[EXCEPTION] Errno::EINVAL:
clock_id がサポートされていない場合に発生します。

[SEE_ALSO] Time.now