为什么Rails在启动时预先加载所有依赖项(gems)?

时间:2011-10-03 16:33:02

标签: ruby-on-rails ruby performance gem bundler

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

您遇到的大量加载时间是您添加到项目中的gem / plugins / libraries。许多重要尺寸提供了仅加载所需部分的方法,还有更多可以使用此优化。例如,如果您有一个不需要Active Record的Rails项目,则可以替换:

require 'rails/all'

...与:

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

...在你的application.rb中减少加载(并避免数据库不存在的错误)。