clock_gettime(clock_id, unit=:float_second) -> Float | Integer
[permalink][rdoc][edit]-
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