См. 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 и т.д. может помочь вам увидеть то, что называется.
Гэри: Большое спасибо за материалы. Я смотрел на тестирование производительности раньше, но он больше подходит для контроллера (хотя мы можем тестировать модели косвенно, хотя звонки на контроллер). Другие драгоценные камни/пакеты имеют отношение к моему вопросу. Тем не менее, я ищу что-то, что делает именно то, что я хочу: отслеживать время выполнения метода и методов разбивки, которые он вызывает. (Я не знаю, жадна ли я здесь :)) – AdamNYC
Обновлен мой ответ. Это помогает? –
Большое спасибо, Гэри. Не могли бы вы объяснить, как я могу использовать «профиль» в приложении Rails? – AdamNYC