本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。