在Ruby中如何获得以毫秒为单位的运行时间?

在Ruby中如何获得以毫秒为单位的运行时间?,ruby,Ruby,如果我的时间对象来自: Time.now 然后我用同一行实例化另一个对象,我怎么能看到已经过了多少毫秒?第二个对象可以在同一分钟内创建,也可以在接下来的几分钟甚至几小时内创建。尝试从第二个对象中减去第一个对象。现在。像这样: a = Time.now sleep(3) puts Time.now - a # about 3.0 这将为您提供两次之间的浮点秒数(毫秒)。可以帮助您,但它返回秒数 一般来说,在使用基准I时: 输入当前时间的变量 插入试块进行试验 输入一个变量当前时间,减去前面的

如果我的
时间
对象来自:

Time.now

然后我用同一行实例化另一个对象,我怎么能看到已经过了多少毫秒?第二个对象可以在同一分钟内创建,也可以在接下来的几分钟甚至几小时内创建。

尝试从第二个对象中减去第一个对象。现在。像这样:

a = Time.now
sleep(3)
puts Time.now - a # about 3.0
这将为您提供两次之间的浮点秒数(毫秒)。

可以帮助您,但它返回秒数

一般来说,在使用基准I时:

  • 输入当前时间的变量
  • 插入试块进行试验
  • 输入一个变量当前时间,减去前面的当前时间值

这是一个非常简单的过程,所以我不确定您是否真的在问这个问题…

如前所述,您可以对时间对象进行操作,就像它们是数字(或浮点)值一样。这些操作产生的第二分辨率可以很容易地转换

例如:

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

您需要决定是否截断它。

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的strptimestrftime函数在解析和格式化日期/时间字符串(例如,从日志发送/发送)方面非常有用。方便知道的是:

  • 这些函数(%H,%M,%S,…)的格式字符与任何Unix/Linux系统上的C函数几乎相同;及

  • 还有一些:特别是,%L会以毫秒为单位


您可以通过以下方法向上述解决方案添加一点语法糖:

class Time
  def to_ms
    (self.to_f * 1000.0).to_i
  end
end

start_time = Time.now
sleep(3)
end_time = Time.now
elapsed_time = end_time.to_ms - start_time.to_ms  # => 3004

我认为答案选择错误,该方法给出的是秒,而不是毫秒

t = Time.now.t­o_f
=> 1382471965.146

这里我假设浮点值是毫秒

要以毫秒为单位获取时间,最好添加
.round(3)
,因此在某些情况下更精确:

puts Time.now.to_f # => 1453402722.577573

(Time.now.to_f.round(3)*1000).to_i  # => 1453402722578

%L
以ruby表示毫秒

require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")


将以毫秒为单位显示当前时间戳。

答案如下:

t = Time.now.t­o_f
=> 1382471965.146
t_start = Time.now
# time-consuming operation
t_end = Time.now

milliseconds = (t_start - t_end) * 1000.0
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
但是,
Time.now
方法有不准确的风险。我找到了Luca Guidi的这篇文章:

系统时钟一直在浮动,它不只是向前移动。如果您对运行时间的计算是基于它的,那么您很可能会遇到计算错误甚至错误

因此,建议改用
Process.clock\u gettime
。比如:

t_start = Time.now
# time-consuming operation
t_end = Time.now

milliseconds = (t_start - t_end) * 1000.0
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
用法示例:

>> DateTime.now.strftime("%Q")
=> "1541433332357"

>> DateTime.now.strftime("%Q").to_i
=> 1541433332357

很高兴知道!谢谢
unknown
:)无论如何%L只存在于Ruby 1.9;)将a添加到i中,它就是一个整数,例如:((finish-start)*1000.0)to i
finish.to f-start.to f
finish-start
产生浮点
.to\u f
将是多余的。如果使用rails或active support,您可以使用#in#u毫秒方法执行相同的转换
(t2-t1)。在_毫秒
中,选择的答案是正确的。对时间使用加法或减法。现在
将时间视为浮点值,小数点前几秒,小数点后几纳秒(尽管nsec可能不完全准确)。因此,将该值乘以
1000.0
会产生毫秒。是的,但只给出“Time.now”是不准确的,不能准确回答问题。这并没有说明如何获得经过的时间。