RSpec在OS X上的加载时间非常长

5
我们的项目使用Mongodb和RSpec。在我的OS X机器上,单个控制器的RSpec运行时间为: Finished in 0.24996 seconds (文件加载需要25.39秒) 而我的朋友使用Ubuntu,在他的机器上同样的测试运行时间为: Finished in 0.27996 seconds (文件加载需要4.05秒) 我的机器加载时间比他的慢了6倍以上。可能的原因是什么呢?
更新:
有关我们的设置的更多信息:
我们两个都使用ruby 2.2。我们通过guardfile运行规范,使用cmd: bundle exec rspec
我的朋友使用rbenv,which rspec返回: "/home/dan/.rbenv/shims/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

你是否在运行相同的命令?你的Ruby和项目设置是否完全一致? - Stefan
@Stefan,你说的项目设置是什么意思?我们俩都在使用Ruby 2.2。 - Filip Bartuzi
有许多安装Ruby和调用RSpec的方法。任何版本管理器,如rvm、rbenv、chruby,还是像vagrant这样的工具?文件是在您的硬盘上还是在远程系统上?您是通过rspecbundle exec rspec还是rake运行RSpec的?您是否调用了相同的可执行文件(which rspec返回什么)? - Stefan
@Stefan,请查看更新后的问题。 - Filip Bartuzi
time rspec -v 输出什么内容,即为加载 RSpec 环境需要花费多长时间?您使用的 RVM 版本是什么 rvm -v - Alexey Shein
显示剩余4条评论
1个回答

18

Bundler

看起来对我来说是一些打包程序加载问题。我建议做更多的测量。您是否为每个项目使用1个gemset或将所有内容存储在1个gemset中(如果您不使用任何内容,则为真)?如果在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,对我来说一切都很正常),也许您需要将已安装的gems拆分成每个项目的单独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`

如果在相对较小的Gemfile项目中,time rspec -v也会给出很大的数字,则这是由于Bundler问题造成的。

Rails

通常下一个瓶颈是Rails本身。尝试测量一个不加载Rails(即只有spec_helper)的测试,然后再使用Rails(即使用rails_helper)进行测试。
一旦你开始看到数字上的巨大差异,就会知道你在哪里存在问题。

Spring

作为一种快速修复方案来提高Rails性能,可以使用spring gem。如果你使用的是Rails 4.1+,则Spring已经被启用。
要为rspec启用Spring,请将其添加到您的Gemfile中。
gem 'spring-commands-rspec', group: :development

和运行

$ bundle install
$ spring binstub --all

最后一个命令将在您项目的bin文件夹中为所有Spring支持的二进制文件生成包装器(请查看并不要忘记提交它们)。之后,您应该使用bin/rspec运行rspec。第一次运行仍然会很慢,但是所有后续运行应该足够快,因为Rails已经加载。


很不幸,我刚刚发现这不是项目相关的问题。Rails/RSpec在rvm管理的所有ruby版本上加载时间都非常长 :/ - Filip Bartuzi
1
bin/rspec比rspec快约50%。但仍需14秒的加载时间。 - Filip Bartuzi
不可能,因为只有我的机器受到了这样的加载时间影响。我的队友只需要2秒钟的加载时间。 - Filip Bartuzi
2
尝试运行 gem pristine --all 命令,这将使你的 gem 进入一个全新的状态。 - Alexey Shein
1
我发现我的瓶颈似乎在 Spring 上。在运行spring binstub --all 并以 bin/rspec 运行规范后,加载时间从 20 秒减少到 2 秒,这对我来说是一个显著的改进。谢谢! - Sam Kah Chiin
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接