2011-01-19 8 views
44

私は、30秒に近づき始めているコンソールロード時間をスピードアップする比較的簡単な方法があるのだろうかと思っています。私は多くのサブクラスを持っています。そのメソッドはreload!の影響を受けていないようですので、コンソールの起動と終了が多くなります。 IRBは雷を素早く読み込みます。Rails 3 - コンソールのローディング時間を短縮する

私はあまりにも多くの宝石を持っていますか?どのように負荷タスクのタイミングをとるために、何が最大の時間を費やしているのかを確認できますか?ご覧のとおり、私はすでにデベロッパーブーストの宝石を無駄にしようとしました。アプリはPassengerでうまくいきます。それはバグが私のうちから出てくるコンソールロードです。 2.4GHzと4GBのRAMを搭載したMBP OSX 10.6.6で動作します。 RVMを使用していません。

バージョン:

Ovid$ rails -v 
Rails 3.0.3 
Ovid$ ruby -v 
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10] 

メモリ:

Ovid$ vm_stat 
Mach Virtual Memory Statistics: (page size of 4096 bytes) 
Pages free:       118818. 
Pages active:      341320. 
Pages inactive:      99490. 
Pages speculative:     310576. 
Pages wired down:     112527. 
"Translation faults":    23097323. 
Pages copy-on-write:    1270961. 
Pages zero filled:    13836659. 
Pages reactivated:      36. 
Pageins:       165761. 
Pageouts:        0. 
Object cache: 28 hits of 760846 lookups (0% hit rate) 

Gemfile:

source 'http://rubygems.org' 

gem 'rails', '3.0.3' 
gem 'mysql2' 
gem 'foreigner' 
gem 'haml' 
gem 'capistrano' 
gem 'nokogiri' 

#web services 
gem 'yammer4r' 
gem 'ruby-freshbooks' 

#authentication gems from nifty generator 
gem "bcrypt-ruby", :require => "bcrypt" 
gem "mocha", :group => :test 
gem 'authlogic' 

#dev 
group :development do 
    gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git', :require => 'rails_development_boost' 
end 

#testing 
group :test do 
    gem 'database_cleaner' 
    gem 'cucumber-rails' 
    gem 'cucumber' 
    gem 'rspec-rails' 
    gem 'spork' 
    gem 'launchy' 
    gem 'machinist' 
    gem 'faker' 
    gem 'capybara' 
end 

ありがとうございました!

+0

良い質問!あなたが見つけたものを教えてください。 :) –

+0

また、http://www.ruby-forum.com/topic/914379に投稿しました – pendevere

答えて

1

私はあなたのラボコートを着て、その問題を二等分することしか示唆できません。すべての宝石の要件をコメントアウトすると物事がスピードアップするかどうかを確認してください(おそらく、これらの宝石に依存するコードのコメントも含まれます)。そうであれば、一度に半分をコメントアウトしてください。

申し訳ありませんが、これは本当の答えではありません。たとえば、rails runnerとno-opスクリプトを使用して呼び出すことで、Ruby-Profを試すことができます。

私は私のMac上でruby-prof script/rails runner 'nil'を試みたが、あなたがあなたのアプリケーションのためのgitを使用している場合は、単に:-)

EDIT

をクラッシュしたために、あなたはそれがあまりにもコマンドを二分してかどうかを確認しています試みることが表示されます物事が一般的な盛り上がりではなく遅くなった特定の時点があります。

0

リロード!今のところ問題になっています。 thisをご覧ください。あなたが使うことができるいくつかのパッチと、あなたの問題を回避する方法に関するヒントがいくつかあります。

リロードメソッド自体は次のようになります。

# reloads the environment 
def reload!(print=true) 
    puts "Reloading..." if print 
    ActionDispatch::Callbacks.new(lambda {}, false).call({}) 
    true 
end 

このメソッドに環境を追加して、関数をオーバーライドして必要なリロードを強制することができます。

これは私のために働いていますので、それがあなたに役立つかどうかお知らせください。ではごきげんよう。

+0

提案していただきありがとうございます - 私は両方のあなたのパッチとスレッドで長いパッチを試してみました。しかし、私は運がなかった。あなたは行がActionDispatch :: Callbacks.new(Proc.new {}、false).call(RAILS_ENV)と言うべきであることを意味します、そうですか? – pendevere

58

ベンチマークを使用してスタートアップのボトルネックが見つかりました。特に、Kernel.requireを行うラインを見つけて、このようにそれをラップし、バンドラ宝石へとlib /バンドラ/ runtime.rbに移動します。

puts Benchmark.measure("require #{file}") { 
    Kernel.require file 
}.format("%n: %t %r") 

あなたはどこかで「ベンチマーク」を必要と追加する必要がありますconfig/boot.rbのようなあなたのアプリ。それは各宝石を必要とするのにかかる時間を表示します。あなたの結果が私のものと一致するかどうかは保証できませんが、大部分はサブミリ秒と比較して、ロードに1秒以上かかるいくつかの宝石がありました。いくつかは私がの開発のために必要としなかった宝石でしたを開発しましたが、私は開発環境でいくつかのタスクが必要でした。カピストラーノ、shoulda。私はスタートアップの他の分野(初期化子など)をベンチマークしましたが、大きなボトルネックは見つけられませんでした。

私はまだ本当に必要なタスクのものだけをロードするようにアプリを設定する明確な方法を見つけ出していません。おそらく、私はspeedyと呼ばれる環境を作ることができました。RAILS_ENV =スタートアップのためのスピーディーなレールs/cは、私がそれらの宝石を必要としないことを知っています。その後、Gemfileでは、group:speedyを使用して特定のケースでそれらの宝石を除外することができました。

すべて私が言うように、スタートアップの最大の煩わしさは、レイクタスクを実行するために環境全体をロードすることです。私はおそらくそれのためにほとんどの宝石を除外することができたかもしれませんが、Gemfileが乱雑になり始めて、それが価値があるかどうかわかりません。

+7

このハックは、面白いデータを提供します。どのくらい多くの宝石の作家が、自分の仕事が長時間の起動時間にどれくらい貢献しているかを知っているのだろうか。 –

+1

覚えていること: 'ベンチマーク'が必要 そのファイルのどこか – makevoid

+0

この出力はどこに表示されますか?私はログファイルを持っているだろうが、私は何も見ていない。私は正しいruntime.rbを変更しています。私は何が欠けていますか? –

7

遅いGemfileエントリにrequire => nilを追加して、それらを手動で実行する必要があります。例:

gem 'jammit', :require => nil 

私はこれまでのミートアップでこの問題に対処しました。 これは、(このパッチのコメントを参照してください:https://gist.github.com/1008945)ルビー1.9.2のバグのようですあなたは1.9.2-headまたは1.9.3-headに私はちょうどリンク要旨またはアップグレードして1.9.2にパッチを適用することによってそれを修正することができ

。コピーpastableある

+3

良いアイデアのように聞こえます。私たちは、activeadminやomniauthのような宝石が読み込まれるのを待っているので、機能に影響を与えずに後でロードするための最良の戦略が何か不思議です。レールが完全にロードされた後、手動でそれらを手動で要求するのに最適な場所はどこですか? – gingerlime

20

少し適合した形態は、すべてのラップは必要とし、ソート可能な出力を提供します。

# Add this to the top of boot.rb 
require 'benchmark' 
def require(file) 
    puts Benchmark.measure("") { 
    super 
    }.format("%t require #{file}") 
end 

その後、あなたがそれらを参照してくださいするには、no-OPを実行することはできません。

rails runner 1 

たり、それらを並べ替えますトップ50を表示:

rails runner 1 | sort -nr | head -n 50 
+2

for rails 2.3/ruby​​ 1.8.7 'script/runner 1'を使用してください – professormeowingtons

+2

あなたは2日間を保存しました:) – Jayesh

1

これは間違いなくあなたのコードを整理し、ボトルネックを特定することです一度それらの節約をしたら、開発時間を短縮するためにZeusのようなものを調べる価値があります。

gem install zeus 

https://github.com/burke/zeus(ドキュメント)

それはバグがないわけではないですし、時には再起動する必要はないが、私はまだ、高速サーバーとコンソールにより、開発期間の全体的な増加を見ていますが、小さなコードの変更後に再起動します。

関連する問題