Rails应用程序的性能细分

时间:2013-05-22 19:25:56

标签: ruby-on-rails performance

我有一个Rails模型,有几十种方法互相调用如下:

class MyModel
 def function1
 end
 ...
 def functionN
 end

 def summary
   function1
   ...
   functionN
 end

end

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

1 个答案:

答案 0 :(得分:6)

请参阅Profile或在Ruby中使用-rprofile。这是一段摘录:

  

只需要'个人资料':

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

如果这有点过分,我建议benchmark只测试特定的代码块或方法。

请参阅指南中的performance testing了解更多内容。

同时查看ruby-prof,但不要长期留在Gemfile中 - 当与其他一些宝石一起使用时似乎有段错误(例如使用rspec-rails,simplecov和ruby-prof一起运行rspec测试 - >我的seg故障。)

TracerTracePoint(我认为是Ruby 2的一部分),autologset_trace_func等可能会帮助您了解所调用的内容。