Ruby方法的测量和基准时间

时间:2012-07-10 04:00:48

标签: ruby-on-rails ruby time benchmarking interpreter

如何在Ruby中测量方法和该方法中各个语句所花费的时间。如果您看到以下方法,我想测量方法所花费的总时间以及数据库访问和redis访问所用的时间。我不想在每个声明之前写Benchmark.measure。 ruby解释器是否为我们提供了任何钩子?

def foo
# code to access database
# code to access redis. 
end

8 个答案:

答案 0 :(得分:101)

您可以使用Time对象。 (Time Docs

例如,

start = Time.now
# code to time
finish = Time.now

diff = finish - start

diff将以秒为单位,作为浮点数。

编辑:保留end

答案 1 :(得分:75)

最简单的方法:

require 'benchmark'

def foo
 time = Benchmark.measure {
  code to test
 }
 puts time.real #or save it to logs
end

示例输出:

2.2.3 :001 > foo
  5.230000   0.020000   5.250000 (  5.274806)

值包括:cpu时间,系统时间,总时间和实际经过时间。

来源:ruby docs

答案 2 :(得分:23)

使用基准测试报告

require 'benchmark' # Might be necessary.

def foo
  Benchmark.bm(20) do |bm|  # The 20 is the width of the first column in the output.
    bm.report("Access Database:") do 
      # Code to access database.
    end

    bm.report("Access Redis:") do
      # Code to access redis.
    end
  end
end

这将输出如下内容:

                        user     system      total        real
Access Database:    0.020000   0.000000   0.020000 (  0.475375)
Access Redis:       0.000000   0.000000   0.000000 (  0.000037)

<------ 20 ------->  # This is where the 20 comes in. NOTE: Not shown in output.

可以找到更多信息here

答案 3 :(得分:6)

第二个想法,用Ruby代码块参数定义 measure()函数可以帮助简化时间度量代码:

Weekdays.allValues.count

答案 4 :(得分:3)

查看ruby-prof包,它应该具有您需要的内容。它将创建带有时间的巨大调用堆栈。

http://ruby-prof.rubyforge.org/

它可能过于细化,在这种情况下,只需在Benchmark.measure中包装更大的部分可能是一个很好的方法。

答案 5 :(得分:3)

许多答案建议使用Time.now。但是值得注意的是Time.now可以改变。系统时钟可能会漂移,并且可能会被系统管理员或NTP纠正。因此,Time.now可能会向前或向后跳转,并为基准测试提供不准确的结果。

更好的解决方案是使用操作系统的单调时钟,该时钟一直在向前发展。 Ruby 2.1及更高版本允许通过以下方式对此进行访问:

start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# code to time
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
diff = finish - start # gets time is seconds as a float

您可以阅读更多详细信息here。您还可以看到流行的Ruby项目Sidekiq切换到monotonic clock

答案 6 :(得分:2)

本着wquist's answer的精神,但更简单一点,你也可以这样做:

start = Time.now
# code to time
Time.now - start

答案 7 :(得分:0)

另一种方法如何在Rails控制台中自动对代码进行基准测试:https://github.com/igorkasyanchuk/execution_time

您会看到类似的信息,从日志中的请求中获取