当我注意到像这样的简单方法的规格中有0.15s这样的东西时
class String
def to_slug
(self.dup).gsub(/["']/, '').gsub(/@/, 'at').gsub(/&/, 'and').parameterize
end
end
我开始问自己发生了什么,所以在没有参数化的情况下对方法进行基准测试后,我认为这是参数化内部的问题,不一定是方法本身的问题,但从加载方式来看,在我看来,当像这样的Monkey Patches应该被急切加载时,它似乎是懒加载的,这会导致不应该存在的延迟。所以我的问题是,Rails真的很懒地加载包含parameterize的文件吗?有没有办法说服Rails急于将补丁加载到String和其他stdlib。
在config/environments/test.rb
中调用config.threadsafe!
应强制在启动时加载所有代码。请注意,这会将cache_classes
设置为true
,因此不要在development
环境中使用它,否则将丢失代码重新加载。
另一种方法是更改config.eager_load_paths
以包含要加载的目录。
资源:
- Aaron Patterson在他的文章《删除配置线程安全!》中解释了
config.threadsafe!
- Rails的配置指南中有很多关于每个选项的信息