eager_load=true 有什么影响?

What's the impact of eager_load=true?

我想知道为什么在非生产环境中 eager_loadfalse 更受欢迎?我听说过的一个论点是 eager_load eager 加载大部分 Rails 和内存中的应用程序。因此,使用 eager_load 进行单独测试会使它运行得更慢。然而,这引发了一些问题,例如如何在不加载 Rails 和应用程序相关代码的情况下运行测试?急切加载的 Rails 和应用程序相关代码是什么? config.eager_load_namespaces 给出了以下类:

ActiveSupport
ActionDispatch
ActiveModel
ActionView
ActionController
ActiveRecord
ActionMailer
Jquery::Rails::Engine
MyApp::Application

是否所有这些类及其子类都被预先加载?

在开发或测试环境中使用eager_load = false有哪些明显的缺点?

预加载会使 rails 在启动时加载您的所有应用,这会增加启动时间。

例如,如果您只想加载 rails 控制台来检查一个模型的行为,那么您必须等待所有模型、控制器等加载,即使您只想使用其中之一

However this raises some questions like how does a test run without loading Rails and application related code?

测试在尝试使用时按需加载必要的代码。 因此,例如在某些代码行上,测试要使用 ActiveRecord class。 eager_load 设置为 false 这个 class 还不是必需的,这将导致普通 ruby 程序出现异常。然而,在 rails 项目中,测试在使用它时将需要 ActiveRecord 按需。所以最后单个测试运行得更快,因为只需要它需要的代码部分。

此技术与预先加载相反,称为 autoloading

What is the Rails and application related code that is being eager loaded?

查看 https://github.com/rails/rails。一堆东​​西。

Are all of these classes and their subclasses being eager loaded?

What are the clear disadvantages of using eager_load = false in development or testing environment?

在开发环境中,这是一个优势和最佳实践,因为您可以获得更快的启动时间(在使用像 spring 这样的预加载器时被忽略)。重新加载更改以及 cache_classes=false 选项可能也更容易,因为您需要重新加载的东西更少(只是一个假设)。

在测试环境中,如果你想估计一些代码指标,有时你不能使用 eager_load=false 比如代码覆盖或做风格检查。例如。 simple_cov 要求您在开始测试之前先加载所有代码。

而且通常情况下,某些库可能无法与预先加载一起使用,因为它在加载 class 时进行了一些初始化,该 class 甚至在调用其方法之前就必须已经可用。然而,这是一种罕见的情况,话虽如此,它发生在我们身上 neo4j.rb gem