eager_load=true有什么影响?

问题描述 投票:0回答:2

我需要知道为什么在非生产环境中

eager_load
优先于
false
?我听说过的一个论点是,
eager_load
急切地将大部分 Rails 和应用程序加载到内存中。因此,使用 eager_load 进行单独测试会使其运行速度变慢。然而,这引发了一些问题,例如在不加载 Rails 和应用程序相关代码的情况下如何运行测试?正在急切加载的 Rails 和应用程序相关代码是什么?
config.eager_load_namespaces
提供以下课程:

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

所有这些类及其子类都被急切加载吗?

在开发或测试环境中使用

eager_load = false
有哪些明显的缺点?

ruby-on-rails ruby eager-loading
2个回答
13
投票

然而,这引发了一些问题,例如如何在不加载 Rails 和应用程序相关代码的情况下运行测试?

测试在尝试使用时按需加载必要的代码。 例如,在某些代码行上,测试想要使用

ActiveRecord
类。当
eager_load
设置为
false
时,这个类还不是必需的,这将导致普通 ruby 程序出现异常。然而,在 Rails 项目中,测试将在使用时按需需要
ActiveRecord
。因此,最终单个测试运行得更快,因为只需要它所需的代码部分。

此技术与急切加载相反,称为 自动加载

正在急切加载的 Rails 和应用程序相关代码是什么?

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

所有这些类及其子类都被急切加载吗?

是的

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

在开发环境中,这是一个优势和最佳实践,因为您可以获得更快的启动时间(在使用像 spring 这样的预加载器时会被忽略)。与

cache_classes=false
选项一起重新加载更改可能也更容易,因为您需要重新加载的内容更少(只是一个假设)。

在测试环境中,有时如果你想估计一些代码指标,你就不能使用

eager_load=false
例如代码覆盖率或进行样式检查。例如。
simple_cov
要求您在开始测试之前预先加载所有代码。

一般情况下,某些库可能无法用于急切加载,因为它在加载类时进行了一些初始化,而该类在调用其方法之前就必须已经可用。然而,这是一个罕见的情况,话虽如此,它发生在我们的

neo4j.rb
gem

身上

2
投票

预加载使 Rails 在启动时加载所有应用程序,从而增加启动时间。

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

© www.soinside.com 2019 - 2024. All rights reserved.