我们总是习惯将我们的应用程序配置放入环境文件中。这对生产管理没有好处,所以现在我们通过初始化程序加载它:
# myinitializer.rb
ApplicationConfig = YAML.load_file("#{Rails.root}/config/application/default.yml").symbolize_keys()
一旦我们开始通过 访问配置ApplicationConfig
,应用程序测试性能就会变得更糟。一个 rspec 套件从 4 秒下降到 30 秒。
在我们的应用程序控制器中,我们需要使用 a 执行一些操作before_filter
,其工作原理如下:
before_filter :extra_control
def extra_control
if ApplicationConfig.some_flag
...
end
end
声明一个指向ApplicationConfig
完全恢复性能的变量:
config = ApplicationConfig
def extra_control
if config.some_flag
...
end
end
为什么?为什么通过全局变量访问它会破坏性能?我们在视图和其他控制器的整个代码库中执行此操作。我们是否需要以不同的方式执行此操作,例如通过将实例变量注入所有控制器?
编辑:我们确实验证了从 YAML 加载配置的代码以任何一种方式都被调用一次,因此重复加载似乎不是根本原因。
编辑:事实证明,这是一个由作为字符串而不是布尔值加载的设置变量引起的错误,导致应用程序进入测试睡眠模式:(对不起,感谢您的尝试。我生命中的 3 天我永远不会回来了!