Rails观察器导致开发模式下的处理时间变慢

时间:2011-11-04 15:43:49

标签: ruby-on-rails performance ruby-on-rails-3.1 observer-pattern asset-pipeline

我在Rails 3.1.1上,我注意到我的应用程序在开发模式下变得非常慢(15秒)。请参阅下面的我的firebug'Net'列表:

Before!

我做过很多事情:

  • 减少宝石数量
  • 打开课程缓存
  • 将资产调试变为假
  • 将资产压缩转为真
  • 安装rails-dev-boost gem

也许有一些改进,但没有什么能帮助它在运行localhost时我所期望的那么快。也就是说,直到我在application.rb中注释掉我的观察者配置行:

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

然后应用程序再次快速(约1秒)加载时间。现在查看firebug列表:

After!

其他说明:

  • 在Heroku上制作时,它的速度很快(约1秒),正如您所期望的那样。
  • 我正在使用postgresql和Thin;我没有尝试使用其他数据库来查看是否存在此问题。
  • 当我只注意到最后一个观察者user_observer时,加载时间减少了大约一半。
  • development.log中打印的加载时间不反映实际加载时间。资产被标记为304 Not Modified(0ms),他们真的需要一段时间来加载。
  • 是的,我正在使用资产管道

黄金问题:注册观察员是否导致资产加载缓慢?那可以做些什么呢?

2 个答案:

答案 0 :(得分:2)

看看https://github.com/wavii/rails-dev-tweaks

Rails在开发模式下运行每个Sprockets资产请求的所有to_prepare挂钩。这包括自动(重新)加载代码,以及各种宝石在那里执行工作。在你的情况下,观察者正在注册(我相信 - 导致Rails引用你的应用程序的很大一部分,以便引用模型)

rails-dev-tweaks禁用to_prepare&重新加载任何资产请求(以及其他一些资产请求 - 阅读其自述文件的第一部分)。对于任何体面的项目来说,都要大量加快您的开发环境。它还可以配置为您喜欢的任何其他请求执行此操作

答案 1 :(得分:0)

我解决这个问题的方法是重构观察者。 https://gist.github.com/1014971