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

时间:2015-10-23 10:08:09

标签: ruby-on-rails ruby mongodb ruby-on-rails-4 rspec

我们将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

的guardfile运行规范

我的朋友使用rbenv并which rspec返回

“/家/旦/ .rbenv /垫片/ rspec`

我使用rvm和which rspec返回:

$ which rspec
rspec: aliased to bundled_rspec
$ which bundled_rspec
bundled_rspec () {
    _run-with-bundler rspec $@

更新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

1 个答案:

答案 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已经加载,因此所有后续运行应该足够快。