我有一个 Rails 模型,它有几十个相互调用的方法,如下所示:
class MyModel
def function1
end
...
def functionN
end
def summary
function1
...
functionN
end
end
我想检查它调用的每个方法的摘要和细分运行时间的性能。我该怎么做呢?
我有一个 Rails 模型,它有几十个相互调用的方法,如下所示:
class MyModel
def function1
end
...
def functionN
end
def summary
function1
...
functionN
end
end
我想检查它调用的每个方法的摘要和细分运行时间的性能。我该怎么做呢?
请参阅配置文件或-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 时,它似乎会出现段错误) - >对我来说是段错误)。
而且Tracer、TracePoint(我认为现在是 Ruby 2 的一部分)、autolog、set_trace_func等可能会帮助您查看正在调用的内容。