Профиль действия рельса - PullRequest
30 голосов
/ 28 августа 2008

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

Ответы [ 5 ]

40 голосов
/ 28 января 2012

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

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

Сначала добавьте ruby-prof в свой Gemfile, возможно, в группе разработчиков:

group :development do
    gem "ruby-prof"
end

Затем добавьте вокруг фильтра в свой 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 - это немного искусство, но я оставлю это как упражнение.

Дополнительная записка Скотта Джи: Если вы хотите изменить тип измерения, поместите это:

RubyProf.measure_mode = RubyProf::GC_TIME #example

До if в профиле метода контроллера приложения. Вы можете найти список доступных измерений на странице ruby-prof . На момент написания этой статьи потоки данных memory и allocations были повреждены ( см. Дефект ).

9 голосов
/ 28 августа 2008

На профилировании есть Railscast, который стоит посмотреть

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

9 голосов
/ 28 августа 2008

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

1 голос
/ 28 августа 2008

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

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

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

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

0 голосов
/ 27 апреля 2016

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

    o=OpenStruct.new(logger: Rails.logger)
    o.extend ActiveSupport::Benchmarkable
    o.benchmark 'name' do
      # ... your code ...
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...