Подтвердить что ты не робот

Почему рельсы загружаются так медленно, и что я могу с этим поделать?

Rails 3.0 - серьезная собака. Я развиваюсь на Rails в течение 5 лет, и это никогда не было медленнее запуска. В частности, тесты навсегда сохраняются для загрузки на верхнем значении MacBook с SSD, поэтому итерационные циклы сильно страдают. Мне нужно читать статью каждый раз, когда я начинаю тест. Это безумие, а не "подвижное". Я мог бы также компилировать.

Это главная мотивация для меня, чтобы наконец перейти от Rails - когда у меня есть шанс.

Если у кого-то есть решение, предложите его. Я знаю, что многие люди страдают от этой проблемы.

Я не использую rspec - я знаю, что есть решение для помощи в тестах для rspec.

Я использую quick_require и rails-dev-boost, но не оказывает существенного влияния.

Я на Ruby 1.9.2 и должен быть. Один довольно простой тест контроллера занимает 26 секунд на двухъядерном 2,1 ГГц MacBook Air с 4 Гб оперативной памяти и SSD! Почему!?

4b9b3361

Ответ 1

Чтобы процитировать Yehuda Katz:

Есть вещи, которые C требует кода в 1.9, что замедляет работу. Одним из таких примеров является повторная проверка $LOAD_PATH, чтобы убедиться, что он все расширяется при каждом требовании. Это то, что должно быть рассмотрено рубиновым ядром. Ill открыть билет на redmine, если его уже нет.

Я также испытываю эту проблему, и проблема $LOAD_PATH кажется потенциальной причиной. Позволяет надеяться, что он будет исправлен в ближайшее время.

Так звучит для меня так, как вам просто нужно страдать через это, и, надеюсь, это будет исправлено в Ruby 1.9.3.

Ответ 2

Проверьте spork. Он по существу запускает небольшой сервер, который запускает загрузку, а затем ждет тестовых прогонов, позволяя вам загружать один раз, а затем многократно проверять это состояние. Иногда вам придется перезапустить его, если вы внесете определенные изменения в конфигурацию, но по большей части он позволяет вам выполнять быстрые итерации красно-зеленого рефактора.

Ответ 3

проблема заключается в медленности запроса, если вы выполняете минимальное профилирование, например

CPUPROFILE=/tmp/my_app_profile RUBYOPT="-r`gem which perftools | tail -1`" ruby -I lib:test test/unit/user_test.rb
pprof.rb --text /tmp/my_app_profile

вы, вероятно, должны увидеть много времени, затрачиваемого на требование (другой вариант видит много его в загрузке, но я думаю, вы уже знаете, что это не проблема).

В моем окне (osx на macbook pro 2011 13 ", с ядром i5 и вращающимся жестким диском), время больше в порядке 5 секунд, что по-прежнему много, но более терпимо, так что, возможно, это стоит расследовать различия.

Сколько драгоценных камней вы установили в своей системе? Вы пытались запустить тесты/загрузку без пакетов/rubygems?

Ответ 4

Это компромисс, который должен заплатить за то, что ему не приходилось писать заявления "требовать". Rails пытается сделать правильные вещи, и поэтому предварительно загружает все. В основном у вас есть два решения:

  • Используйте библиотеку предварительной загрузки, которая порождает процесс Rails (spork)
  • Не используйте Rails в своих тестах, извлекайте домен, который вы можете тестировать вне Rails (у Destroy All Software есть один скринкаст об этом). При этом возможно пропустить загрузку Rails.

Со всем, что я сказал, используя решение 1). и мой пакет работает под половиной секунды (всего 70 тестов, но ожидание загрузки Rails минимально)

Ответ 5

Да, это очень медленно. О, подождите, mvn install в мои дни java никогда не занимал меньше минуты. С mvn clean install он был сумасшедшим медленным. Счастливые дни, вспоминая, всегда поднимает мой дух.

+1 spork, поскольку @hammar предлагает

объединить с guard https://github.com/guard/guard-test для автоматического запуска тестов, и у вас есть комбинация убийц. Попросите его запустить в нем собственное окно и/или экран и посмотреть, как повышается производительность:)

Обновление/дополнение к ответу:

Совет по оптимизации: поместите a to_s в пути, добавленные в autoload_paths, в application.rb, избегая этого, чтобы вручную делать это снова и снова во время выполнения. Мог бы сэкономить несколько секунд...

Ответ 6

Как сообщает @user185374, вы платите компромисс require.

Я наткнулся на интересный ресурс, чтобы ускорить тесты Rails, не используя Rails... Пример приведен с помощью Rspec но у вас будет логика.

Вот как писатель подводит итог:

Я не могу сказать вам, что значит запускать все мои 150 + спецификации в течение 2 секунд. Я думаю, что это немного лишний работа, но это стоит усилий!

Другое решение, которое я только что нашел: Hydra параллельное тестирование:

http://logicalfriday.com/2011/05/18/faster-rails-tests-with-hydra/

Ответ 7

Это известная проблема, особенно на Ruby 1.9.2.

Хорошей новостью является то, что патч, чтобы ускорить запуск Ruby (require).

Ответ 8

Хорошие новости. Rails запускается в течение допустимого промежутка времени после обновления до Ruby 1.9.3.

Ответ 9

Посмотрите zeus gem.

Это должно значительно ускорить процесс.