当Rails启动时,它会预加载它的所有依赖项(gems),这会导致启动时间非常慢。在我正在开发的一个中型项目中,Rails的开始时间是10-15秒,取决于机器。为什么Rails在启动时预加载所有依赖项(gems)?
虽然这不是生产中的问题,但这是一个巨大的开发难题。特别是在工作TDD/BDD时。有加速测试的解决方案(如spork),但它们会引入他们自己的问题。
我的问题是:为什么不需要每个代码文件中所需的依赖项,而不是在启动时预加载所有内容?
手动需要什么缺点?额外的代码行?
当Rails启动时,它会预加载它的所有依赖项(gems),这会导致启动时间非常慢。在我正在开发的一个中型项目中,Rails的开始时间是10-15秒,取决于机器。为什么Rails在启动时预加载所有依赖项(gems)?
虽然这不是生产中的问题,但这是一个巨大的开发难题。特别是在工作TDD/BDD时。有加速测试的解决方案(如spork),但它们会引入他们自己的问题。
我的问题是:为什么不需要每个代码文件中所需的依赖项,而不是在启动时预加载所有内容?
手动需要什么缺点?额外的代码行?
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
削减负荷(避免关于数据库的错误不存在)。
http://stackoverflow.com/questions/3418895/how-to-reload-all-gems-in-rails-3 – jimworm
考虑在TDD风格下使用自动测试或类似的工具。 – taro
@taro我正在使用guard-rspec(与autottest做同样的事情),但这对启动时间没有帮助。 – arikfr