Подтвердить что ты не робот

Профиль действия контроллера рельсов

Каков наилучший способ профилировать действие контроллера в Ruby on Rails. В настоящее время я использую метод грубой силы для вызова puts Time.now между тем, что, по моему мнению, будет узким местом. Но это действительно действительно грязно. Там должен быть лучший способ.

4b9b3361

Ответ 1

Я подобрал эту технику некоторое время назад и нашел ее очень удобной.

Когда это произойдет, вы можете добавить ?profile=true к любому URL, который попадает в контроллер. Ваше действие будет выполняться в обычном режиме, но вместо того, чтобы доставлять визуализированную страницу в браузер, она отправит подробную, хорошо отформатированную страницу ruby-prof, которая показывает, где ваше действие потратило время.

Во-первых, добавьте ruby-prof в ваш Gemfile, возможно, в группу разработчиков:

group :development do
    gem "ruby-prof"
end

Затем добавьте вокруг фильтра в ApplicationController:

around_action :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. На момент записи потоки данных в memory и allocations казались поврежденными (см. Дефект).

Ответ 2

Используйте стандартную библиотеку Benchmark и различные тесты, доступные в Rails (unit, function, integration). Вот пример:

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 и Test:: Ссылка на блок. Кроме того, если вы входите в "чтение книги", я взял идею для примера из Agile Web Development с Rails, в котором говорится все о различных типах тестирования и немного о тестировании производительности.

Ответ 4

Возможно, вы захотите дать службу FiveRuns TuneUp, так как это действительно впечатляет. Отказ от ответственности: я не связан с FiveRuns каким-либо образом, я просто попробовал эту службу.

TuneUp - это бесплатный сервис, в котором вы загружаете плагин, и когда вы запускаете приложение, он вводит панель в верхней части экрана, которая может быть расширена, чтобы отображать подробные показатели производительности.

Он дает вам несколько хороших графиков, в том числе тот, который показывает, какая часть времени проводится в модели, представлении и контроллере. Вы можете даже выполнить сверление вниз, чтобы увидеть отдельные SQL-запросы, которые выполняет ActiveRecord, если вам нужно, и он может показать вам базовую схему базы данных с помощью другого щелчка.

Наконец, вы можете по желанию загрузить свои данные профилирования на сайт FiveRuns для анализа и консультаций с общественностью.

Ответ 5

Это работает в Rails 4.2.6:

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