本文簡要介紹ruby語言中 Process.clock_gettime
的用法。
用法
clock_gettime(clock_id [, unit]) → number
返回 POSIX clock_gettime
() 函數返回的時間。
p Process.clock_gettime(Process::CLOCK_MONOTONIC)
#=> 896053.968060096
clock_id
指定一種時鍾。它被指定為以 Process::CLOCK_
開頭的常量,例如 Process::CLOCK_REALTIME
和 Process::CLOCK_MONOTONIC
。
支持的常量取決於操作係統和版本。如果可用,Ruby 提供以下類型的clock_id
。
CLOCK_REALTIME
-
SUSv2 到 4、Linux 2.5.63、FreeBSD 3.0、NetBSD 2.0、OpenBSD 2.1、macOS 10.12、Windows-8/Server-2012
CLOCK_MONOTONIC
-
SUSv3 至 4、Linux 2.5.63、FreeBSD 3.0、NetBSD 2.0、OpenBSD 3.4、macOS 10.12、Windows-2000
CLOCK_PROCESS_CPUTIME_ID
-
SUSv3 到 4,Linux 2.5.63,FreeBSD 9.3,OpenBSD 5.4,macOS 10.12
CLOCK_THREAD_CPUTIME_ID
-
SUSv3 到 4、Linux 2.5.63、FreeBSD 7.1、OpenBSD 5.4、macOS 10.12
CLOCK_VIRTUAL
-
FreeBSD 3.0, OpenBSD 2.1
CLOCK_PROF
-
FreeBSD 3.0, OpenBSD 2.1
CLOCK_REALTIME_FAST
-
FreeBSD 8.1
CLOCK_REALTIME_PRECISE
-
FreeBSD 8.1
CLOCK_REALTIME_COARSE
-
Linux 2.6.32
CLOCK_REALTIME_ALARM
-
Linux 3.0
CLOCK_MONOTONIC_FAST
-
FreeBSD 8.1
CLOCK_MONOTONIC_PRECISE
-
FreeBSD 8.1
CLOCK_MONOTONIC_COARSE
-
Linux 2.6.32
CLOCK_MONOTONIC_RAW
-
Linux 2.6.28、macOS 10.12
CLOCK_MONOTONIC_RAW_APPROX
-
macOS 10.12
CLOCK_BOOTTIME
-
Linux 2.6.39
CLOCK_BOOTTIME_ALARM
-
Linux 3.0
CLOCK_UPTIME
-
FreeBSD 7.0,OpenBSD 5.5
CLOCK_UPTIME_FAST
-
FreeBSD 8.1
CLOCK_UPTIME_RAW
-
macOS 10.12
CLOCK_UPTIME_RAW_APPROX
-
macOS 10.12
CLOCK_UPTIME_PRECISE
-
FreeBSD 8.1
CLOCK_SECOND
-
FreeBSD 8.1
CLOCK_TAI
-
Linux 3.10
請注意,SUS 代表單一 Unix 規範。 SUS 包含 POSIX, clock_gettime
在 POSIX 部分中定義。 SUS 定義 CLOCK_REALTIME
強製,但 CLOCK_MONOTONIC
、 CLOCK_PROCESS_CPUTIME_ID
和 CLOCK_THREAD_CPUTIME_ID
是可選的。
此外,有幾個符號被接受為 clock_id
。 clock_gettime
() 有仿真。
例如,當 clock_gettime
() 不可用時, Process::CLOCK_REALTIME
被定義為:GETTIMEOFDAY_BASED_CLOCK_REALTIME
。
CLOCK_REALTIME
的仿真:
- :GETTIMEOFDAY_BASED_CLOCK_REALTIME
-
使用 SUS 定義的gettimeofday()。 (不過,SUSv4 淘汰了它。)分辨率為 1 微秒。
- :TIME_BASED_CLOCK_REALTIME
-
使用 ISO C 定義的time()。分辨率為 1 秒。
CLOCK_MONOTONIC
的仿真:
- :MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC
-
使用mach_absolute_time(),在 Darwin 上可用。分辨率取決於 CPU。
- :TIMES_BASED_CLOCK_MONOTONIC
-
使用 POSIX 定義的times() 的結果值。 POSIX 將其定義為“times() 應返回過去的任意點(例如,係統 start-up 時間)以來經過的實時時間(以時鍾滴答為單位)”。例如,GNU/Linux 返回一個基於 jiffies 的值,它是單調的。但是,4.4BSD 使用gettimeofday(),它不是單調的。 (不過,FreeBSD 使用
clock_gettime
(CLOCK_MONOTONIC
)。)分辨率是時鍾滴答聲。 “getconf CLK_TCK”命令顯示每秒時鍾滴答數。 (在舊係統中,每秒時鍾滴答數由 HZ 宏定義。)如果是 100,clock_t 為 32 位整數類型,則分辨率為 10 毫秒,不能表示超過 497 天。
CLOCK_PROCESS_CPUTIME_ID
的仿真:
- :GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID
-
使用 SUS 定義的getrusage()。 getrusage()與RUSAGE_SELF配合使用,僅獲取調用進程的時間(不包括子進程的時間)。結果是用戶時間 (ru_utime) 和係統時間 (ru_stime) 相加。分辨率為 1 微秒。
- :TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID
-
使用 POSIX 定義的times()。結果是用戶時間 (tms_utime) 和係統時間 (tms_stime) 相加。 tms_cutime 和 tms_cstime 被忽略以排除子進程的時間。分辨率是時鍾滴答聲。 “getconf CLK_TCK”命令顯示每秒時鍾滴答數。 (每秒時鍾滴答數由舊係統中的 HZ 宏定義。)如果為 100,則分辨率為 10 毫秒。
- :CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID
-
使用 ISO C 定義的clock()。分辨率為 1/CLOCKS_PER_SEC。 CLOCKS_PER_SEC 是 time.h 定義的 C-level 宏。 SUS 將CLOCKS_PER_SEC 定義為 1000000。不過,非 Unix 係統可能將其定義為不同的值。如果CLOCKS_PER_SEC 為 1000000 作為 SUS,則分辨率為 1 微秒。如果CLOCKS_PER_SEC 為 1000000,clock_t 為 32 位整數類型,則不能表示超過 72 分鍾。
如果不支持給定的clock_id
,則會引發 Errno::EINVAL。
unit
指定返回值的類型。
- :float_second
-
浮點數秒數(默認)
- :float_millisecond
-
毫秒數作為浮點數
- :float_microsecond
-
微秒數作為浮點數
- :第二
-
以整數表示的秒數
- :毫秒
-
毫秒數作為整數
- :微秒
-
以整數表示的微秒數
- :納秒
-
納秒數作為整數
底層函數 clock_gettime
() 返回納秒數。 Float
對象(IEEE 754 雙精度)不足以表示 CLOCK_REALTIME
的返回值。如果需要精確的納秒值,請使用 :nanoseconds
作為 unit
。
返回值的原點(零)會有所不同。例如,係統啟動時間、進程啟動時間、Epoch 等。
CLOCK_REALTIME
中的原點被定義為紀元(1970-01-01 00:00:00 UTC)。但是有些係統會計算閏秒,而其他係統則不會。因此,結果可以在不同係統之間進行不同的解釋。 Time.now
比 CLOCK_REALTIME
更推薦。
相關用法
- Ruby Process.clock_getres用法及代碼示例
- Ruby Process.groups用法及代碼示例
- Ruby Process.wait2用法及代碼示例
- Ruby Process.getpgrp用法及代碼示例
- Ruby Process.setproctitle用法及代碼示例
- Ruby Process.setrlimit用法及代碼示例
- Ruby Process.uid用法及代碼示例
- Ruby Process.pid用法及代碼示例
- Ruby Process.detach用法及代碼示例
- Ruby Process.maxgroups用法及代碼示例
- Ruby Process.exec用法及代碼示例
- Ruby Process.groups=用法及代碼示例
- Ruby Process.getsid用法及代碼示例
- Ruby Process.getpriority用法及代碼示例
- Ruby Process.times用法及代碼示例
- Ruby Process.getpgid用法及代碼示例
- Ruby Process.euid用法及代碼示例
- Ruby Process.exit用法及代碼示例
- Ruby Process.setpriority用法及代碼示例
- Ruby Process.kill用法及代碼示例
- Ruby Process.initgroups用法及代碼示例
- Ruby Process.spawn用法及代碼示例
- Ruby Process.egid用法及代碼示例
- Ruby Process.last_status用法及代碼示例
- Ruby Process.setsid用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Process.clock_gettime。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。