我们将Mongodb和RSpec用于我们的项目。在我的OS X机器上,单个控制器的RSpec运行于:
Finished in 0.24996 seconds (files took 25.39 seconds to load)
另一方面,我的朋友有Ubuntu,对他来说,同样的规格在:
Finished in 0.27996 seconds (files took 4.05 seconds to load)
我的机器上的加载时间超过6倍。可能是什么原因?
P.S。不使用OS X不是解决方案:/
有关我们设置的更多信息:
我们都使用ruby 2.2。我们通过带有cmd: bundle exec rspec
我的朋友使用rbenv并which rspec
返回
“/家/旦/ .rbenv /垫片/ rspec`
我使用rvm和which rspec
返回:
$ which rspec
rspec: aliased to bundled_rspec
$ which bundled_rspec
bundled_rspec () {
_run-with-bundler rspec $@
我刚刚克隆了https://github.com/eliotsykes/rspec-rails-examples并运行了rspec。加载文件花了36多秒。所以这不是与mongodb有关。我刚刚注意到rails服务器也加载了很长时间。
> time rspec -v
3.3.2
real 0m2.539s
user 0m1.067s
sys 0m0.185s
答案 0 :(得分:10)
看起来像我的一些捆绑加载问题。我建议进行更多测量。你是否每个项目都使用1个gemset,或者将所有内容存储在1个gemset中(如果你不使用任何内容,它是真的吗?)如果你在1个目录中有很多宝石(即所有人都有1个宝石),它最终会减慢捆绑器的速度,因为它需要遍历更多的路径才能完成它的工作。
bundle | wc -l # how many gems bundler uses in your current project
gem list -q | wc -l # how many gems in your gemset
如果gem list -q | wc -l
报告了相当大的价值(我有237
并且一切对我而言似乎正常),也许您需要将已安装的宝石拆分为每个项目的单独gemset。
使用time
命令进行更多测量,查找real
值及其总和。
首先,删除bundled_rspec
包装,latest RVM版本不需要它。
然后使用和不使用Bundler来测量你的rspec加载:
time rspec -v # with implicit bundler loading, rubygems-bundler gem is in use
time NOEXEC_DISABLE=1 rspec -v # without bundler, disable rubygems-bundler gem for this call`
如果time rspec -v
为您提供大数字,即使对于Gemfile相对较小的项目,它也是一个捆绑问题。
下一个瓶颈通常是Rails本身。尝试测量一个不加载Rails的测试(即仅spec_helper
),然后使用rails进行测试(即使用rails_helper
)。
一旦你开始看到数字上的巨大差异,你就会知道你遇到问题的地方。
作为提高导轨性能的快速解决方案,可以使用spring
gem。如果你使用Rails 4.1+ Spring已经启用。
启用Spring rspec
添加到Gemfile
gem 'spring-commands-rspec', group: :development
并运行
$ bundle install
$ spring binstub --all
上一个命令将为项目的bin
文件夹中的所有弹簧支持的二进制文件生成包装器(看看那里并且不要忘记提交它们)。之后,您应该使用rspec
运行bin/rspec
。首次运行仍然很慢,但由于Rails已经加载,因此所有后续运行应该足够快。