2011-10-03 10 views
6

Railsが起動すると、すべての依存関係(gems)がプリロードされ、起動時間が非常に遅くなります。私が取り組んでいる中規模のプロジェクトでは、Railsの開始時間はマシンに依存して10〜15秒です。Railsが起動時にすべての依存関係(gem)をプリロードするのはなぜですか?

これは生産上の問題ではありませんが、開発には大きな苦労があります。特にTDD/BDDを動作させる場合。テストをスピードアップするソリューション(sporkなど)がありますが、独自の問題が導入されています。

私の質問は、起動時にすべてをプリロードするのではなく、各コードファイルに必要な依存関係を必要としないのはなぜですか?

手動要求の短所は何ですか?余分なコード行?

+0

http://stackoverflow.com/questions/3418895/how-to-reload-all-gems-in-rails-3 – jimworm

+0

TDDスタイルで作業する場合、オートテストまたは同様のツールを使用することを検討してください。 – taro

+0

@taro私はguard-rspecを使用しています(autottestと同じことをします)が、起動時には役に立ちません。 – arikfr

答えて

3

RailsはPHPではありません。いくつかのリソースはオートロードされていますが、必要なものはすべてブート/初期化時にロードされます。要求が行われる前に実行してアプリケーションが要求に応じて遅延ロードするよりも準備ができているためです最初のリクエスト。メソッドのロードとクラスの読み込みのこの最後の時間のオンザフライの定義の多くは、に単なる10-15秒へのロード時間を削減しますが、そのロード時間の5-10秒をカットした場合、それはちょうど最初の要求に縛られるだろう。いいよ、そう?

あなたが経験する負荷時間は、プロジェクトに追加する宝石/プラグイン/ライブラリに多くあります。重要なサイズの多くは、必要な部分だけをロードする方法を提供し、この最適化をさらに多く使用できます。あなたがアクティブレコードを必要としないRailsのプロジェクトを持っている場合たとえば、あなたは置き換えることができます。

require 'rails/all' 

を...と:

require "action_controller/railtie" 
require "action_mailer/railtie" 
require "active_resource/railtie" 
require "rails/test_unit/railtie" 

...あなたのapplication.rbにバックロードの削減(および避けるために、データベースに関するエラーは存在しません)。

+0

これは理にかなっていますが、問題が本番/最初の要求にしかない場合は、それを解決する他の方法があります。開発にペナルティを課すのはなぜですか? – arikfr

+0

開発と生産をより緊密に保つため、私は推測します。 Railsは、多くのクラスをキャッシュしないようにすることで、開発の問題を緩和し、各リクエストでそれらを再ロードするので、サーバーを頻繁に停止して起動する必要はありません。これを達成するための他の推奨事項があれば、私はそれを聞いてみたいと思っています.Railsチームが改良を加えたパッチを見たいと思っています。 – coreyward

+0

これはペナルティではありません。これはビジネスのコストです。開発サーバーの最初のページの読み込みでも遅延が発生します。コマンドラインに遅延やブラウザの遅延があるかどうかの問題です。 – Kelly

関連する問題