我们过去常常将应用程序配置放在环境文件中。但这样做对于生产管理来说并不好,所以现在我们通过一个初始化器来加载它:
# myinitializer.rb
ApplicationConfig = YAML.load_file("#{Rails.root}/config/application/default.yml").symbolize_keys()
一旦我们通过
ApplicationConfig
开始访问配置,应用程序测试性能就会明显下降。一个rspec套件从4秒降至30秒。在我们的应用控制器中,我们需要使用
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天!