Профиль действия контроллера рельсов
Каков наилучший способ профилировать действие контроллера в 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 для профилирования, который стоит посмотреть
http://railscasts.com/episodes/98-request-profiling
Ответ 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