2013-03-22 62 views
1

我一直有问题,我的规格代码花费的时间比预期的要长,但是当我试图在rspec-prof下运行它们时,问题似乎消失了。最终我跟踪了差异,直到运行rake本地比较运行它在解释器下。为什么在rake下rspec很慢? ruby_noexec_wrapper?

只运行rake需要75秒,但运行ruby $(which rake)只需要12秒。这比快了5倍。请看:

$ 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秒运行。

任何想法,为什么这应该是这种情况?

除了避免直接运行耙子,还有什么可以改进它吗?由于这是将宝石打包成二进制文件的标准方式,是不是可能会减慢所有宝石打包工具的速度?

回答

1

让我们来看看ruby_noexec_wrapper文件(RVM 17年1月16日):

#!/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',不可能是一个问题,因为红宝石1.9+ does this automatically

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

当他们被加载时,宝石不应该做很多事情,但不幸的是,他们中的许多人在该领域犯了一些错误。解决这个问题的唯一方法就是试着弄清楚哪些宝石会导致大部分缓慢,并在可能的情况下寻找替代品。