2013-05-22 2 views
3

У меня есть модель Rails, которая имеет множество методов, призывающие друг друг следующим образом:пробой производительности для Rails приложения

class MyModel 
def function1 
end 
... 
def functionN 
end 

def summary 
    function1 
    ... 
    functionN 
end 

end 

Я хотел бы проверить производительность резюме и пробивного запустить время каждого из методов вызываемых. Как мне это сделать?

ответ

6

См. Profile или используйте -rprofile в Ruby. Вот выдержка:

Просто требуется 'Профиль':

require 'profile' 

def slow_method 
    5000.times do 
    9999999999999999*999999999 
    end 
end 

def fast_method 
    5000.times do 
    9999999999999999+999999999 
    end 
end 

slow_method fast_method 

Выход в обоих случаях является отчет, когда исполнение заканчивается:

ruby -rprofile example.rb 

    % cumulative self    self  total time seconds 
seconds calls ms/call ms/call name 
68.42  0.13  0.13  2 65.00 95.00 Integer#times 
15.79  0.16  0.03  5000  0.01  0.01 Fixnum#* 
15.79  0.19  0.03  5000  0.01  0.01 Fixnum#+ 
    0.00  0.19  0.00  2  0.00  0.00 IO#set_encoding 
    0.00  0.19  0.00  1  0.00 100.00 Object#slow_method 
    0.00  0.19  0.00  2  0.00  0.00 Module#method_added 
    0.00  0.19  0.00  1  0.00 90.00 Object#fast_method 
    0.00  0.19  0.00  1  0.00 190.00 #toplevel 

Итак, вы можете добавьте require 'profile' где-нибудь в вашем коде (но после этого он значительно замедлит обработку), а затем, когда среда Rails выходит, она выведет информацию профилирования. Например, вы можете сделать это в консоли Rails. Во-первых:

rails c 

Тогда:

require 'profile' 
MyModel.some_method_that_you_want_to_profile 
exit 

Процедить, могли бы сделать:

rails c 2>&1 | tee profile.txt 

А затем проверить, как описано выше, то после того, как вы сделали:

grep MyModel profile.txt 

Или включить заголовки и избавиться от непрофилирования Выход:

grep -E "MyModel\#|cumulative self|seconds call" profile.txt 

Если это перебор, я хотел бы предложить benchmark только для тестирования конкретных блоков кода или методов.

См. performance testing в руководстве для гораздо большего.

Также проверьте ruby-prof, но не оставляйте его в своем Gemfile долговременно - он, кажется, имеет ошибки seg при использовании с некоторыми другими драгоценными камнями (например, при использовании rspec-rails, simplecov и ruby-prof вместе при запуске rspec tests -> seg faults for me).

И Tracer, TracePoint (часть 2 Руби теперь я думаю), autolog, set_trace_func и т.д. может помочь вам увидеть то, что называется.

+0

Гэри: Большое спасибо за материалы. Я смотрел на тестирование производительности раньше, но он больше подходит для контроллера (хотя мы можем тестировать модели косвенно, хотя звонки на контроллер). Другие драгоценные камни/пакеты имеют отношение к моему вопросу. Тем не менее, я ищу что-то, что делает именно то, что я хочу: отслеживать время выполнения метода и методов разбивки, которые он вызывает. (Я не знаю, жадна ли я здесь :)) – AdamNYC

+0

Обновлен мой ответ. Это помогает? –

+0

Большое спасибо, Гэри. Не могли бы вы объяснить, как я могу использовать «профиль» в приложении Rails? – AdamNYC