eager_load = true的影响是什么?

时间:2015-01-08 05:43:03

标签: ruby-on-rails

我需要知道为什么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有哪些明显的缺点?

2 个答案:

答案 0 :(得分:5)

  

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

测试在尝试使用时按需加载必要的代码。 因此,例如在某些代码行上,测试想要使用ActiveRecord类。将eager_load设置为false此类不是必需的,这将导致vanilla ruby​​程序出现异常。但是在rails项目中,测试在使用时需要ActiveRecord。因此,最后一次测试运行得更快,因为只需要它所需的代码部分。

这种技术与急切加载相反,它被称为autoloading

  

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

结帐https://github.com/rails/rails。这是一堆东西。

  

是否所有这些类及其子类都需要加载?

  

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

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

在测试环境中,如果您想估算一些代码指标,有时您无法使用eager_load=false 像代码覆盖或做样式检查。例如。 simple_cov要求您在开始测试之前急切加载所有代码。

通常情况下,某些库可能无法与急切加载一起使用,因为它在加载一个必须在调用其方法之前已经可用的类时进行了一些初始化。然而,这是一种罕见的情况,尽管如此,它发生在我们身上neo4j.rb宝石

答案 1 :(得分:1)

Eager load会让rails在启动时加载你的所有应用程序,这会增加启动时间。

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