Наблюдатель Rails вызывает медленное время обработки в режиме разработки - PullRequest
4 голосов
/ 04 ноября 2011

Я на Rails 3.1.1 и заметил, что мое приложение стало очень медленным (15 секунд) в режиме разработки.Посмотрите мой список «Нет» в Firebug ниже:

Before!

Я сделал несколько вещей, таких как:

  • сокращение количества драгоценных камней
  • превращение кэширования класса в
  • превращение отладки актива в false
  • превращение сжатия актива в true
  • установка гема rails-dev-boost

Может быть, были некоторые улучшения, но ничто не помогло ему идти так быстро, как я ожидал при запуске с localhost.То есть до тех пор, пока я не закомментировал строку конфигурации своих наблюдателей в application.rb:

config.active_record.observers = :item_observer, :loan_observer, :friendship_observer, :message_observer, :user_observer

А затем приложение снова быстро загрузилось (~ 1 сек) времени загрузки.Смотрите список пожарных:

After!

Другие примечания:

  • Когда вы работаете на Heroku, это быстро (~ 1 сек), как выбуду ожидать.
  • Я использую postgresql и Thin;Я не пробовал использовать другие БД, чтобы увидеть, существует ли эта проблема.
  • Когда я закомментировал только последнего наблюдателя, user_observer, время загрузки сократилось примерно вдвое.
  • Время загрузки, напечатанное вdevelopment.log не отражает фактическое время загрузки.Активы были помечены как 304 Не изменены (0 мс), они действительно потребовали некоторое время для загрузки.
  • Да, я использую конвейер активов

Золотой вопрос: Является ли простой акт регистрации наблюдателей причиной медленной загрузки активов?И что с этим можно сделать?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Взгляните на https://github.com/wavii/rails-dev-tweaks.

Rails запускает все хуки to_prepare для каждого запроса ресурса Sprockets в режиме разработки. Это включает в себя такие вещи, как автоматическая (повторная) загрузка вашего кода, и различные гемы также выполняют работу там. И в вашем случае, наблюдатели регистрируются (что, я полагаю, заставляет Rails ссылаться на значительную часть вашего приложения, чтобы ссылаться на модели)

rails-dev-tweaks отключает to_prepare & reloading при любом запросе актива (и некоторых других - читайте первую часть его README). Ускоряет вашу среду разработки на огромную сумму для любого приличного размера проекта. Это также можно настроить для любых дополнительных запросов, которые вам нравятся

0 голосов
/ 11 ноября 2011

То, как я это исправляю, - это рефакторинг наблюдателей на проблемы. https://gist.github.com/1014971

...