3

我有一个 Rails 模型,它有几十个相互调用的方法,如下所示:

class MyModel
 def function1
 end
 ...
 def functionN
 end

 def summary
   function1
   ...
   functionN
 end

end

我想检查它调用的每个方法的摘要和细分运行时间的性能。我该怎么做呢?

4

1 回答 1

6

请参阅配置文件-rprofile在 Ruby 中使用。这是一段摘录:

只需要“个人资料”:

require 'profile'

def slow_method
  5000.times do
    9999999999999999*999999999
  end
end

def fast_method
  5000.times do
    9999999999999999+999999999
  end
end

slow_method fast_method

两种情况下的输出都是执行结束时的报告:

ruby -rprofile example.rb

  %   cumulative   self              self     total  time   seconds  
seconds    calls  ms/call  ms/call  name
 68.42     0.13      0.13        2    65.00    95.00  Integer#times
 15.79     0.16      0.03     5000     0.01     0.01  Fixnum#*
 15.79     0.19      0.03     5000     0.01     0.01  Fixnum#+
  0.00     0.19      0.00        2     0.00     0.00  IO#set_encoding
  0.00     0.19      0.00        1     0.00   100.00  Object#slow_method
  0.00     0.19      0.00        2     0.00     0.00  Module#method_added
  0.00     0.19      0.00        1     0.00    90.00  Object#fast_method
  0.00     0.19      0.00        1     0.00   190.00  #toplevel

因此,您可以require 'profile'在代码中添加某处(但之后会显着减慢处理速度),然后当 Rails 环境退出时,它将输出分析信息。对于您的示例,您可能会在 Rails 控制台中执行此操作。第一的:

rails c

然后:

require 'profile'
MyModel.some_method_that_you_want_to_profile
exit

要过滤,可以这样做:

rails c 2>&1 | tee profile.txt

然后像上面那样测试,然后在你完成之后:

grep MyModel profile.txt

或者包括标题并摆脱非分析输出:

grep -E "MyModel\#|cumulative   self|seconds    call" profile.txt

如果这太过分了,我建议只测试特定代码块或方法的基准

有关更多信息,请参阅指南中的性能测试

还要检查ruby ​​-prof ,但不要将它长期留在您的 Gemfile 中 - 当与其他一些 gem 一起使用时(例如,在运行 rspec 测试时同时使用 rspec-rails、simplecov 和 ruby​​-prof 时,它似乎会出现段错误) - >对我来说是段错误)。

而且TracerTracePoint(我认为现在是 Ruby 2 的一部分)、autologset_trace_func等可能会帮助您查看正在调用的内容。

于 2013-05-22T20:12:56.747 回答