在OS X上RSpec加载时间令人难以置信

Fil*_*uzi 1 ruby rspec ruby-on-rails mongodb ruby-on-rails-4

我们将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倍.可能是什么原因?

PS不使用OS X不是解决方案:/

更新:

有关我们设置的更多信息:

我们都使用ruby 2.2.我们通过guardfile运行specscmd: 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 $@
Run Code Online (Sandbox Code Playgroud)

更新2:

我刚刚克隆了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
Run Code Online (Sandbox Code Playgroud)

Ale*_*ein 11

捆绑

看起来像我的一些捆绑加载问题.我建议做一些更多的测量.你是每个项目使用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 
Run Code Online (Sandbox Code Playgroud)

如果gem list -q | wc -l报告相当大的价值(我已经237和我的一切看起来都很正常),也许您需要将已安装的宝石拆分为每个项目的单独gemset.

使用time命令进行更多测量,查找real值,它是总和.

首先,删除你的bundled_rspec包装,最新的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`
Run Code Online (Sandbox Code Playgroud)

time rspec -v即使对于具有相对较小的Gemfile的项目,如果给你大数字,那也是一个捆绑问题.

轨道

下一个瓶颈通常是Rails本身.尝试测量一个不加载Rails的测试(即刚刚spec_helper测试),然后用导轨测试(即用rails_helper).

一旦你开始看到数字上的巨大差异,你就会知道你遇到问题的地方.

弹簧

作为改善导轨性能的快速解决方案是spring宝石的用途.如果你使用Rails 4.1+ Spring已经启用.

启用S​​pring以rspec添加到您的Gemfile

gem 'spring-commands-rspec', group: :development
Run Code Online (Sandbox Code Playgroud)

并运行

$ bundle install
$ spring binstub --all
Run Code Online (Sandbox Code Playgroud)

最后一个命令将为项目bin文件夹中所有弹簧支持的二进制文件生成包装器(看看那里并且不要忘记提交它们).在此之后,你应该运行rspec使用bin/rspec.首次运行仍然很慢,但由于Rails已经加载,因此所有后续运行应该足够快.

  • 尝试`gem pristine --all`,这将使您的宝石处于新鲜状态。 (2认同)