Answers:
如前所述,您可以Time
像处理数字(或浮点)值一样操作对象。这些操作导致可以轻松转换的第二分辨率。
例如:
def time_diff_milli(start, finish)
(finish - start) * 1000.0
end
t1 = Time.now
# arbitrary elapsed time
t2 = Time.now
msecs = time_diff_milli t1, t2
您将需要决定是否将其截断。
finish.to_f - start.to_f
?
finish - start
产生浮点;.to_f
将是多余的。
(t2 - t1).in_milliseconds
我认为答案选择不正确,该方法给出的是秒而不是毫秒。
t = Time.now.to_f
=> 1382471965.146
在这里,我假设浮点值是毫秒
Time.now
会将时间视为浮点值,小数点前为秒,小数点后为纳秒(尽管nsec可能不完全准确)。因此,将该值乘以将1000.0
产生毫秒数。
ezpz的答案几乎是完美的,但我希望我可以再添加一点。
Geo询问了时间(以毫秒为单位);这听起来像是整数,我不会绕过浮点地。因此,我的方法是:
irb(main):038:0> t8 = Time.now
=> Sun Nov 01 15:18:04 +0100 2009
irb(main):039:0> t9 = Time.now
=> Sun Nov 01 15:18:18 +0100 2009
irb(main):040:0> dif = t9 - t8
=> 13.940166
irb(main):041:0> (1000 * dif).to_i
=> 13940
乘以整数1000会完美保留分数,并且可能也会快一点。
如果要处理日期和时间,则可能需要使用DateTime类。这类似地工作,但是转换因子为24 * 3600 * 1000 = 86400000。
我发现DateTime的strptime和strftime函数在解析和格式化日期/时间字符串(例如到/从日志)中非常有用。方便知道的是:
这些函数的格式字符(%H,%M,%S等)几乎与任何Unix / Linux系统上的C函数相同;和
还有其他一些:特别是%L可以毫秒!
unknown
:)
DateTime.now.strftime("%Q")
用法示例:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
Time.now.to_f可以为您提供帮助,但返回秒数。
通常,在使用基准测试时,我:
这是一个非常简单的过程,所以我不确定您是否真的在问这个...
%L
给出红宝石的毫秒数
require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
要么
puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
将为您提供当前时间戳(以毫秒为单位)。
答案是这样的:
t_start = Time.now
# time-consuming operation
t_end = Time.now
milliseconds = (t_start - t_end) * 1000.0
但是,该Time.now
方法存在不准确的风险。我发现了Luca Guidi的这篇文章:
https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
系统时钟一直在浮动,并且不会向前移动。如果您基于它来计算经过时间,则很可能会遇到计算错误甚至中断。
因此,建议改为使用Process.clock_gettime
。就像是:
def measure_time
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
yield
end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
elapsed_time = end_time - start_time
elapsed_time.round(3)
end
例:
elapsed = measure_time do
# your time-consuming task here:
sleep 2.2321
end
=> 2.232