spec コードの実行に予想以上に時間がかかるという問題がありましたが、 で実行しようとするとrspec-prof
、問題が解決したように見えました。rake
最終的に、ネイティブで実行することと、インタープリターで実行することとの違いを追跡しました。
ランニングにはわずか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 秒走ります。
これが当てはまる理由はありますか?
rake を直接実行するのを避ける以外に、それを改善するためにできることはありますか? これは gem をバイナリにラップする標準的な方法であるため、gem でパッケージ化されたすべてのツールの速度が低下する可能性はありませんか?