2008-08-27 5 views
29

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

ответ

9

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

+3

Этот ответ говорит вам, как убедиться, что ваши действия работает достаточно быстро. Это не поможет вам с профилированием, которое выясняет, какая часть действия занимает больше всего времени. – 2010-07-20 14:22:43

1

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

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

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

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

+3

Ссылка не действительна (DNS истек). – mrzasa 2012-12-27 14:47:55

39

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

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

Во-первых, добавить рубиновый-Prof к вашему Gemfile, вероятно, в группе развития:

group :development do 
    gem "ruby-prof" 
end 

Затем добавьте around filter к вашему 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 

Чтение вывода рубин-Prof является бит искусства, но я оставлю это как упражнение.

Дополнительное примечание ScottJShea: Если вы хотите изменить тип измерения место это:

RubyProf.measure_mode = RubyProf::GC_TIME #example

Перед тем как if в методе профиля контроллера приложения. Вы можете найти список доступных измерений на ruby-prof page. На момент написания этого сообщения потоки данных memory и allocations, по-видимому, были повреждены (see defect).

+4

для всех, кто купил это, вам также нужно добавить «require« ruby-prof »в верхней части вашего ApplicationController. Кроме того, для меня мне пришлось изменить «self.response_body =» на «self.response.body =» (Rails 2.3.14) – Pavling 2012-09-23 10:01:53

0

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

o=OpenStruct.new(logger: Rails.logger) 
    o.extend ActiveSupport::Benchmarkable 
    o.benchmark 'name' do 
     # ... your code ... 
    end 
Смежные вопросы