我有一个Rails模型,有几十种方法互相调用如下:
class MyModel
def function1
end
...
def functionN
end
def summary
function1
...
functionN
end
end
我想检查它调用的每种方法的摘要和细分运行时间的性能。我应该怎么做呢?
答案 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故障。)
而Tracer,TracePoint(我认为是Ruby 2的一部分),autolog,set_trace_func等可能会帮助您了解所调用的内容。