2013-03-22 58 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你可以看到它正在設置捆綁。這涉及到需要寶石,這可能是你的慢啓動的來源。

當他們被加載時,寶石不應該做很多事情,但不幸的是,他們中的許多人在該領域犯了一些錯誤。解決這個問題的唯一方法就是試着弄清楚哪些寶石會導致大部分緩慢,並在可能的情況下尋找替代品。