【问题标题】:Profile a rails controller action分析 Rails 控制器操作
【发布时间】:2010-09-07 01:49:00
【问题描述】:

在 Ruby on Rails 中分析控制器操作的最佳方式是什么。目前,我正在使用蛮力方法在我认为将成为瓶颈的之间进行puts Time.now 调用。但这感觉真的,真的很脏。一定有更好的方法。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    不久前我学会了这项技术,发现它非常方便。

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

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

    group :development do
        gem "ruby-prof"
    end
    

    然后将around filter 添加到您的ApplicationController:

    around_action :performance_profile if Rails.env == 'development'
    
    def performance_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)。

    【讨论】:

    • 对于任何无法粘贴此内容的人,您还需要在 ApplicationController 的顶部添加“require 'ruby-prof'”。另外,对我来说,我必须将“self.response_body=”更改为“self.response.body=”(Rails 2.3.14)
    • 感谢您的调整。在 Rails 3.0 中添加了response_body。如果您使用的是 bundler,则不需要 ruby​​-prof,但我很高兴这种技术非常适用于旧版本的 Rails。
    • 感谢您的提示,帕夫林。我也在使用 rails 2.3.14,并且无法使其正常工作。无论我安装什么版本的 ruby​​-prof,我都会在 graph_html_printer.rb:98:in `full_name' 中得到“错误数量的参数(0 代表 1)”。知道是什么原因造成的吗?
    • 要让它覆盖 JSON、XML 等的返回格式,请将其添加到 if 语句中:headers["Content-Type"] = "text/html"
    【解决方案2】:

    使用 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 中汲取了这个例子的想法,其中谈到了不同的测试类型和一些性能测试。

    【讨论】:

    • 这个答案告诉您如何确保您的操作运行得足够快。它不能帮助您进行分析,即找出操作的哪个部分花费的时间最多。
    【解决方案3】:

    有一个关于性能分析的 Railscast 非常值得一看

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

    【讨论】:

      【解决方案4】:

      您可能想尝试一下FiveRuns TuneUp 服务,因为它确实令人印象深刻。 免责声明:我与 FiveRuns 没有任何关系,我只是尝试过这项服务。

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

      它为您提供了一些漂亮的图表,包括显示在模型、视图和控制器上花费的时间比例的图表。如果需要,您甚至可以向下钻取以查看 ActiveRecord 正在执行的各个 SQL 查询,并且只需单击一次即可显示底层数据库架构。

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

      【讨论】:

      • 链接已损坏(DNS 已过期)。
      【解决方案5】:

      这适用于 Rails 4.2.6:

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

      【讨论】:

      • 这不会在日志或其他地方显示任何内容。
      猜你喜欢
      • 2013-09-05
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多