2011-10-03 42 views
6

当Rails启动时,它会预加载它的所有依赖项(gems),这会导致启动时间非常慢。在我正在开发的一个中型项目中,Rails的开始时间是10-15秒,取决于机器。为什么Rails在启动时预加载所有依赖项(gems)?

虽然这不是生产中的问题,但这是一个巨大的开发难题。特别是在工作TDD/BDD时。有加速测试的解决方案(如spork),但它们会引入他们自己的问题。

我的问题是:为什么不需要每个代码文件中所需的依赖项,而不是在启动时预加载所有内容?

手动需要什么缺点?额外的代码行?

+0

http://stackoverflow.com/questions/3418895/how-to-reload-all-gems-in-rails-3 – jimworm

+0

考虑在TDD风格下使用自动测试或类似的工具。 – taro

+0

@taro我正在使用guard-rspec(与autottest做同样的事情),但这对启动时间没有帮助。 – arikfr

回答

3

Rails不是PHP。有些资源是自动加载的,但所有可能需要加载的资源都是在启动/初始化时加载的,因为在进行请求之前最好这样做,因此应用程序已准备就绪,而不是根据请求延迟加载它们,从而减慢速度第一个请求。很多最后一分钟的方法和类的加载定义仍然发生,将加载时间减少到仅仅10-15秒,但如果您减少5-10秒的加载时间,它只是在第一个请求上加上。不好,对吧?

您经历的很多加载时间都在您添加到项目中的gem/plugins/libraries中。许多重要的大小提供了只加载你需要的部分的方法,更多的可以使用这种优化。例如,如果你有一个Rails项目不需要活动记录,可以更换:

require 'rails/all' 

...有:

require "action_controller/railtie" 
require "action_mailer/railtie" 
require "active_resource/railtie" 
require "rails/test_unit/railtie" 

...在你application.rb削减负荷(避免关于数据库的错误不存在)。

+0

这是有道理的,但如果问题仅在生产/第一次请求中,还有其他方法可以解决。为什么要对发展施加惩罚? – arikfr

+0

为了保持开发和生产更紧密的联系,我会假设。 Rails通过不缓存许多类来缓解开发中的问题,并在每次请求时重新加载它们,因此您不需要经常停止和启动服务器。如果您对如何实现这一目标有其他建议,我很乐意听到他们的意见,我相信Rails团队很乐意看到有改进的补丁。 – coreyward

+0

这不是一种惩罚。这是做生意的成本 - 您仍然会在开发服务器首页加载时获得延迟。这只是你的命令行延迟或浏览器延迟的问题。 – Kelly

相关问题