配置导轨控制器动作

时间:2008-08-27 23:31:22

标签: ruby-on-rails ruby

在Ruby on Rails中分析控制器操作的最佳方法是什么?目前我正在使用蛮力方法在我认为将成为瓶颈之间投入puts Time.now电话。但这感觉非常非常脏。必须有更好的方法。

5 个答案:

答案 0 :(得分:40)

我一会儿拿起这种技术,发现它非常方便。

当它到位时,您可以将?profile=true添加到任何击中控制器的URL。您的操作将照常运行,但不会将呈现的页面传送到浏览器,而是会发送一个详细的,格式良好的ruby-prof页面,显示您的操作花费的时间。

首先,将ruby-prof添加到您的Gemfile中,可能在开发组中:

group :development do
    gem "ruby-prof"
end

然后将around filter添加到ApplicationController:

around_filter :profile if Rails.env == 'development'

def profile
  if params[:profile] && result = RubyProf.profile { yield }

    out = StringIO.new
    RubyProf::GraphHtmlPrinter.new(result).print out, :min_percent => 0
    self.response_body = out.string

  else
    yield
  end
end

阅读ruby-prof输出有点艺术,但我会把它留作练习。

ScottJShea补充说明: 如果您想更改测量类型,请执行以下操作:

RubyProf.measure_mode = RubyProf::GC_TIME #example

在应用程序控制器的配置文件方法中的if之前。您可以在ruby-prof page找到可用测量的列表。在撰写本文时,memoryallocations数据流似乎已损坏(see defect)。

答案 1 :(得分:9)

使用Benchmark标准库和Rails中提供的各种测试(单元,功能,集成)。这是一个例子:

def test_do_something
  elapsed_time = Benchmark.realtime do
    100.downto(1) do |index|
      # do something here
    end
  end
  assert elapsed_time < SOME_LIMIT
end

所以在这里我们只做100次,通过Benchmark库计时,并确保花费的时间少于SOME_LIMIT。

您还可以找到这些链接:Benchmark.realtime referenceTest::Unit reference。此外,如果您正在阅读“书籍阅读”的内容,我会从Agile Web Development with Rails中获取该示例的想法,其中介绍了不同的测试类型以及一些性能测试。

答案 2 :(得分:9)

有关于分析的Railscast非常值得观看

http://railscasts.com/episodes/98-request-profiling

答案 3 :(得分:1)

您可能希望尝试FiveRuns TuneUp服务,因为它确实令人印象深刻。 免责声明:我没有以任何方式与FiveRuns联系,我刚试过这项服务。

TuneUp是一项免费服务,您可以下载插件,当您运行应用程序时,它会在屏幕顶部注入一个面板,可以展开该面板以显示详细的性能指标。

它为您提供了一些不错的图表,包括显示模型,视图和控制器中花费的时间比例的图表。如果需要,您甚至可以向下钻取以查看ActiveRecord正在执行的各个SQL查询,并且可以通过另一次单击向您显示基础数据库模式。

最后,您可以选择将分析数据上传到FiveRuns网站,以进行社区绩效分析和建议。

答案 4 :(得分:-1)

这适用于Rails 4.2.6:

    o=OpenStruct.new(logger: Rails.logger)
    o.extend ActiveSupport::Benchmarkable
    o.benchmark 'name' do
      # ... your code ...
    end