Rails应用程序配置访问速度慢 - 为什么?

xcu*_*cut 7 app-config ruby-on-rails

我们总是习惯将应用程序配置放入环境文件中.这对生产管理没有好处,所以现在我们通过初始化程序加载它:

# myinitializer.rb
ApplicationConfig = YAML.load_file("#{Rails.root}/config/application/default.yml").symbolize_keys()
Run Code Online (Sandbox Code Playgroud)

一旦我们开始访问配置ApplicationConfig,应用程序测试性能就会变得更糟.一个rspec套件从4秒减少到30秒.

在我们的应用程序控制器中,我们需要使用a执行一些操作before_filter,其工作方式如下:

before_filter :extra_control

def extra_control
  if ApplicationConfig.some_flag
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

声明一个指向ApplicationConfig完全恢复性能的变量:

config = ApplicationConfig

def extra_control
  if config.some_flag
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

为什么?为什么通过全局变量访问它会破坏性能?我们在视图和其他控制器的整个代码库中执行此操作.我们是否需要以不同方式执行此操作,例如将实例变量注入所有控制器?

编辑:我们确实验证了从YAML加载配置的代码无论哪种方式都被调用一次,因此重复加载似乎不是根本原因.

编辑:事实证明这是一个由设置变量引起的错误,该变量被加载为字符串而不是布尔值,导致应用程序进入测试睡眠模式:(对不起,感谢您的尝试.我生命的3天我永远不会回来!

xcu*_*cut 0

这里的其他答案没有什么区别 - 这是由一个不相关的问题引起的。作为记录

  • 初始化程序仅由 rspec 调用一次
  • 使用 ApplicationConfig 还是 APPLICATION_CONFIG 都没有区别
  • 分配给变量也不会造成速度差异