答案 0 :(得分:3)
Ruby可用的最精确的计时器是Process::clock_gettime
。为避免精确浮动舍入,请使用:nanosecond
单位:
3.times { p Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) }
# => 1491185078101717000
# => 1491185078101741000
# => 1491185078101747000
编辑:这是Time.now
提供的同一时间。在Linux上,两者具有纳秒精度。但是,即使在OSX上,还有另一个时钟具有纳秒精度:CLOCK_MONOTONIC
。此时钟不会跟踪纪元的时间,而是来自"某些事件"的时间,此事件通常是您计算机的启动时间。为了获得最精确的时间,可以在CLOCK_REALTIME
和CLOCK_MONOTONIC
之间取得差异并稍后应用:
clock_diff = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) -
Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond)
3.times {
nsec = Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond) + clock_diff
time = Time.at(nsec / 1_000_000_000, nsec % 1_000_000_000 / 1_000.0)
p time.strftime("%Y-%m-%d %H:%i:%s.%N")
}
答案 1 :(得分:1)
在Linux上,我认为最准确的时间只是Time.now
。 to_r
方法"旨在用于获得表示自Epoch以来纳秒的准确值。 (来自docs)。
t = Time.now
p t.to_r # =>(1491206113721862629/1000000000)
p [t.to_i, t.nsec] # =>[1491206113, 721862629]
答案 2 :(得分:1)
在JRuby上,您可以使用java.lang.System.nano_time
:
java.lang.System.nano_time - java.lang.System.nano_time
# -15607
从固定但任意的原点获得纳秒。来自文档:
此方法只能用于测量经过的时间而不是 与系统或挂钟时间的任何其他概念有关。价值 返回表示自某些固定但任意来源以来的纳秒 时间(也许在将来,所以价值可能是负面的)。相同 在a的实例中,此方法的所有调用都使用origin Java虚拟机;其他虚拟机实例很可能 使用不同的来源。
如果你想要一个精确的Java时间< 9,你可以使用currentTimeMillis
:
java.lang.System.current_time_millis
#=> 1491214503112
但是,你不会从Time.now
获得更多信息:
Time.now.to_f
#=> 1491214592.562
所以Time.now
可能是你最好的选择:它适用于任何系统上的任何Ruby版本。请注意纳秒精度doesn't mean纳秒精度。
我敢说你可以忽略与毫秒相关的任何数字。你可以用微米输出纽约和洛杉矶之间的距离,但这并不意味着它会有用。