为什么rspec在rake下这么慢? ruby_noexec_wrapper?

时间:2013-03-22 12:58:04

标签: ruby rspec rake

我的规范代码运行时遇到了比预期更长的问题,但当我尝试在rspec-prof下运行时,问题似乎消失了。最后,我跟踪差异,直到运行rake与在解释器下运行它进行本地比较。

仅运行rake需要75秒,但运行ruby $(which rake)只需要12秒。那个超过五次更快。看看:

$ rake
~/.rvm/rubies/ruby-1.9.2-p320/bin/ruby -w -S rspec spec/args_spec.rb spec/levels_spec.rb spec/opts_spec.rb spec/run_spec.rb spec/split_spec.rb spec/unit_spec.rb
~/.rvm/gems/ruby-1.9.2-p320/gems/bundler-1.2.3/lib/bundler/source.rb:516: warning: method redefined; discarding old revision
..................................................

Finished in 1 minute 14.39 seconds
50 examples, 0 failures

$ ruby `which rake`
~/.rvm/rubies/ruby-1.9.2-p320/bin/ruby -w -S rspec spec/args_spec.rb spec/levels_spec.rb spec/opts_spec.rb spec/run_spec.rb spec/split_spec.rb spec/unit_spec.rb
..................................................

Finished in 12.88 seconds
50 examples, 0 failures

查看rake“包装二进制文件的内容”显示在“#!”中它在解释器下运行的行 - ruby_noexec_wrapper - 确定运行命令为:

ruby_noexec_wrapper $(which rake)

同样缓慢的75秒运行。

为什么会出现这种情况?

除了避免直接运行rake之外还有什么可以改进的吗?既然这是将宝石包装成二进制文件的标准方法,那么这可能会减慢所有宝石包装工具的速度吗?

1 个答案:

答案 0 :(得分:1)

让我们来看看ruby_noexec_wrapper文件(rvm 1.16.17):

#!/usr/bin/env ruby

original_file=ARGV[0]
ARGV.shift
$PROGRAM_NAME=original_file

require 'rubygems'
begin
  require 'rubygems-bundler/noexec'
rescue LoadError
  warn "unable to load rubygems-bundler/noexec" if ENV.key?('NOEXEC_DEBUG')
end

eval File.read(original_file), binding, original_file

据我所知,这两个警告区域是两个require语句。第一个require 'rubygems'不太可能成为问题,因为ruby 1.9 + does this automatically

我认为问题出在require 'rubygems-bundler/noexec'。如果您take a look at what it's doing,您可以看到它正在设置捆绑器。这涉及到需要宝石,这很可能是你慢启动的源头。

宝石在加载时不应该做很多事情,但不幸的是,很多人在这方面犯了一些错误。解决这个问题的唯一方法是尝试找出导致大部分缓慢的宝石并尽可能找到替代方案。