Ruby и Rails имеют базовые инструменты профилирования, которые могут вам помочь.Взгляните на это руководство по Rails: Тестирование производительности приложений Rails .
На этой странице описывается, как вы можете написать тестовые случаи, предназначенные для тестирования производительности, чтобы предотвратить снижение производительности и как вы можете выполнить профилирование, котороеможет быть так просто:
rails profiler 'Ruby.code.to.run'
Если это не сработает, подумайте об использовании New Relic .Но я бы также взглянул на Rack-Bug (кстати, у него есть ветвь Rails 3 для Rails 3).Rack-Bug - это панель инструментов для отладки, которая дает вам множество замечательных метрик о том, сколько времени было потрачено на запрос, и делает это прямо в браузере, наряду с обычным ответом, так что это наименее болезненно.
Теперь, то, что вы делаете неправильно:
- вам следует избегать толстых представлений, так как жирные представления сложно тестировать, сложно отлаживать и сложно профилировать
- вам следует избегать медленного кодав вашем веб-процессе, поскольку он блокирует доступ других клиентов к вашему веб-серверу, вместо этого переместите всю эту логику в асинхронную очередь заданий
Поэтому рассмотрите возможность перемещения этой обработки в очередь заданий. Delayed_job довольно надежен, правильно поддерживается и работает с Rails 3.
Таким образом, ваш взгляд зарегистрирует новую работу и вернется.И когда работа будет завершена, вы установите где-нибудь флаг, что она будет выполнена.Затем с помощью специального вызова API вы можете проверять его полноту из клиентского Javascript раз в несколько секунд.И после завершения вы можете показать результаты, перенаправить или начать загрузку или что-то еще, снова из Javascript.
И если вышеупомянутое не вариант (возможно, это страница, которая показывает отчет, который должен быть мгновенным)первое узкое место, которое вы должны рассмотреть, это выполнение SQL-запросов, поэтому ознакомьтесь с командой MySQL DESCRIBE (или EXPLAIN PostgreSQL).Таким способом легко увидеть, где вам нужны индексы.