Ruby on rails 为什么Rails在引导期间预加载所有依赖项(gems)?

Ruby on rails 为什么Rails在引导期间预加载所有依赖项(gems)?,ruby-on-rails,ruby,performance,gem,bundler,Ruby On Rails,Ruby,Performance,Gem,Bundler,当Rails启动时,它会预加载所有依赖项(gem),这会导致启动时间非常慢。在我正在进行的一个中型项目中,Rails的启动时间是10-15秒,具体取决于机器 虽然这不是生产中的问题,但却是开发中的巨大痛苦。特别是在使用TDD/BDD时。有加快测试速度的解决方案(如spork),但它们引入了自己的问题 我的问题是:为什么不在每个代码文件中要求所需的依赖项,而不是在启动时预加载所有内容 手动操作的缺点是什么?额外的代码行不是PHP。有些资源是自动加载的,但您可能需要的所有资源都在引导/初始化时加载,

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

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

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


手动操作的缺点是什么?额外的代码行不是PHP。有些资源是自动加载的,但您可能需要的所有资源都在引导/初始化时加载,因为最好在发出请求之前加载,这样应用程序就准备好了,而不是在请求时延迟加载,从而减慢第一个请求的速度。很多方法和类加载的最后一分钟的动态定义仍然在发生,将加载时间缩短到10-15秒,但是如果您将加载时间缩短5-10秒,它将被附加到第一个请求上。不好,对吧

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

require 'rails/all'
…与:

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

…在您的
应用程序.rb中
以减少加载(并避免数据库不存在的错误)。

这是有道理的,但如果问题仅出现在生产/第一次请求中,则有其他方法可以解决。为什么要对发展施加惩罚?为了让发展和生产更紧密地联系在一起,我假设。Rails不缓存许多类,在每次请求时为您重新加载它们,这样您就不需要频繁地停止和启动服务器,从而有助于缓解开发中的问题。如果您对如何实现这一点有其他建议,我很乐意听取他们的意见,我相信Rails团队也希望看到一个改进的补丁。这不是惩罚。这是做生意的成本——开发服务器的第一页加载也会延迟。这只是命令行延迟还是浏览器延迟的问题。@coreyward开发即使在今天也与生产不一样,因为开发中没有类缓存。至于可能的替代解决方案:如何在每个文件中明确要求,并在生产中使用bundler预加载所有内容(仅限liek今天)?它将解决第一个请求惩罚,同时取消对开发的惩罚,不是吗?@凯莉,这是今天做生意的成本,但这并不意味着它必须是这样的。考虑在使用TDD风格时使用AutoTestor或类似的工具。@ TARO我使用的是保护RSPEC(与自动测试相同的事情),但是这对启动时间没有帮助。