Каков наилучший способ профилировать действие контроллера в Ruby on Rails. В настоящее время я использую метод грубой силы для вызова puts Time.now
между тем, что, по моему мнению, будет узким местом. Но это действительно действительно грязно. Там должен быть лучший способ.
Профиль действия контроллера рельсов
Ответ 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, в котором говорится все о различных типах тестирования и немного о тестировании производительности.
Ответ 3
Там Railscast для профилирования, который стоит посмотреть
Ответ 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