18

更新 2これは、Ruby 1.9.2 がファイルをロードする方法に関する既知のバグ/機能です。 http://twitter.com/#!/rails/status/72801149769621504

更新:これは質問として始まりましたが、これに少し取り組んだ後、修正できない可能性があると思います. 他の誰かが同じことを見て、レールとバンドラーの内部で何が起こっているのか疑問に思っている場合に備えて、これを投稿すると思いました。

Rails 3 アプリのロード時間が長いと感じている人はいますか? environment.rb、application.rb、boot.rb、railties/lib/rails/initializable.rb にタイマーを配置しました。時間は秒単位で測定され、経過時間は最後に記録された時間からの時間です。プロダクションの読み込み時間は少し長くなります。ハードウェアが少ないことと、eager_load が原因の 1 つです。(そしておそらくThin vs Mongrelから)。Bundler が読み込み時間の大きな部分を占めているように見えますが、それは当然のことだと思います。dev と prod でアプリの 1 つをテストし、dev で空のアプリを 1 つテストしました。Thin が原因であるかどうかを確認するためだけに、2 つのアプリ サーバーをテストしました。また、prod の Passenger でも同様の現象が見られます (これにより、2.2.15 のスポーン動作で使用できなくなります)。エッジ Rails に対してテストしたところ、dev のパフォーマンスは 14.5 秒と 14.2 秒でわずかに劣っていました。テストの依存関係を削除すると、2 ~ 3 秒節約できますが、テストを実行しているときには役に立ちません。すべての Thin インスタンスが再起動するまで 5 分間待機し、テストが実行されるまで 15 秒間待機するのは少し面倒だと思いますが、Rails 3 で得られる生産性のために、現時点では許容できるトレードオフです。物事をスピードアップするのに役立つアイデア、私はすべて耳です。テスト結果は次のとおりです。

注: Rails 2.3 の私のアプリは、dev で 3 秒未満でロードされました (ただし、rails3 に移行してから、コードの一部をエンジンに変換し、haml と twitter_oauth の gem を追加しました)。

**Rails 3RC と Ruby 1.9.2rc2 を使用して実施されたすべてのテスト

Prod with Thin - CentOS 5.5、Rackspace クラウド サーバー 2GB インスタンス
24 個の gem 依存関係を持つテスト アプリ #1

env.rb を開始 - 合計 = 0
  app.rb を開始 - 0.00110546 経過。合計=0.001180052  
    boot.rb を開始 - 0.000600488 経過。合計=0.00178644    
    終了 boot.rb - 0.7935529 経過。合計=0.795507318  
    start require rails/all - 0.000189127 が経過しました。合計=0.795701199  
    最後に Rails/all が必要です - 1.086998364が経過しました。合計=1.882735263  
    Bundler の開始が必要です - 0.000109708 が経過しました。合計=1.88285043  
    end Bundler の要求 - 8.955853243経過。合計=10.838746673  
  app.rb 終了 - 0.062975913 経過。合計=10.901753753  
  # /railties-3.0.0.rc/lib/rails/initializable.rb
  実行イニシャライザの開始 - 0.000145906 が経過しました。合計=10.901910186  
    load_environment_config - 0.116689774 が経過しました。合計=11.018632298  
    initialize_cache - 0.246161343 が経過しました。合計=11.320543397  
    active_record.initialize_database - 0.080047485 経過。合計=11.400961893  
    bootstrap_hook - 1.034189984 が経過しました。合計=12.451309104  
    active_support.initialize_time_zone - 1.969821814 が経過しました。合計=14.448777651  
    action_controller.set_configs - 0.594991537 が経過しました。合計=15.044692126  
    will_paginate.active_record - 0.324460921 経過。合計=15.386837641  
    will_paginate.action_view - 1.904889132経過。合計=17.328981523  
    add_view_paths - 0.087811847 が経過しました。合計=17.42011881  
    load_init_rb - 0.151282681 経過。合計=17.709093173  
    load_init_rb - 0.362241273 経過。合計=18.071865548  
    load_config_initializers - 0.144051305 経過。合計=18.217433492  
    build_middleware_stack - 2.569453884経過。合計=20.826842081  
    熱心なロード!- 4.165919064経過。合計=24.99280168  
    Finisher_hook - 0.48795935 経過。合計=25.480807439  
    repopulate_roles - 0.504085662 経過。合計=25.984901297  
  実行初期化子の終了 - ~0.00005 経過。合計=25.985617783  
end env.rb - ~0.00006 経過。合計=25.985683903  

Dev with Mongrel - Max OSX 10.5.8、2.66 Core2duo、4GB RAM
Test App #1、24 gem の依存関係あり

start boot.rb (Bundler.setup) - 2.0e-05 経過。合計=3.1e-05  
終了 boot.rb (Bundler.setup) - 2.352435経過。合計=2.352915  
app.rb を開始 - 0.084945 経過。合計=2.437866  
  start require rails/all - 0.000181 経過。合計=2.438049  
  最後にレール/すべてが必要 - 0.489425 経過。合計=2.927485  
  Bundler.require(:default, Rails.env) を開始 - 5.6e-05 経過。合計=2.927544  
  end Bundler.require(:default, Rails.env) - 5.16162経過。合計=8.089177  
app.rb 終了 - 0.025972 経過。合計=8.11516  
env.rb を開始 - 0.084153 経過。合計=8.199329
  # /railties-3.0.0.rc/lib/rails/initializable.rb
  run_initializers を開始 - 0.002709 経過。合計=8.202042   
    initialize_cache - 0.089231 経過。合計=8.518005  
    bootstrap_hook - 0.602342 経過。合計=9.192564  
    active_support.initialize_time_zone - 0.901676経過。合計=10.10115  
    action_controller.set_configs - 0.375864 経過。合計=10.477565  
    will_paginate.active_record - 0.207447 経過。合計=10.694479  
    will_paginate.action_view - 1.041412経過。合計=11.75974  
    load_init_rb - 0.051938 経過。合計=11.879547  
    load_init_rb - 0.082936 経過。合計=12.001311  
    load_init_rb - 0.18798 経過。合計=12.189555  
    load_config_initializers - 0.079461 経過。合計=12.269971  
    build_middleware_stack - 1.390042経過。合計=13.729273  
    Finisher_hook - 0.082274 経過。合計=13.811648  
    repopulate_roles - 0.350287 経過。合計=14.161941  
  run_initializers の終了 - 3.0e-06 が経過しました。合計=14.177869  
end env.rb - 0.000127 経過。合計=14.178002  

2 つの gem 依存関係を持つ Mongrel Test App #2 を使用した 開発

start boot.rb (Bundler.setup) - Total=0
終了 boot.rb (Bundler.setup) - 1.724158経過。合計=1.724199
app.rb を開始 - 0.041006 経過。合計=1.765211
  start require rails - 0.000151 経過。合計=1.765364
  最後にレールが必要 - 0.360051 経過。合計=2.125426
  Bundler.require(:default, Rails.env) を開始 - 5.5e-05 経過。合計=2.125485
  end Bundler.require(:default, Rails.env) - 0.008396 経過。合計=2.133889
app.rb 終了 - 0.007805 経過。合計=2.141704
env.rb を開始 - 0.16541 経過。合計=2.307128
  run_initializers を開始 - 0.00031 経過。合計=2.307442
    load_active_support - 0.24045 経過。合計=2.579421
    active_support.initialize_time_zone - 0.206237 経過。合計=2.837663
    action_controller.deprecated_routes - 0.210291 経過。合計=3.048634
    build_middleware_stack - 0.220663 経過。合計=3.273035
  run_initializers の終了 - 3.0e-06 が経過しました。合計=3.29339
end env.rb - 8.7e-05 経過。合計=3.293483
4

3 に答える 3

2

これはかなり古い質問なので、Rails 3 のリリース バージョンでテストしましたか?

それは長い時間ですが、最終的には意味がありません。私の Rails アプリは一度に何ヶ月も稼働しているため、これは総実行時間の 1% にすぎません。

Bundler が対処しなければならない大量の依存関係がありますか? Rails 3 アプリはどの環境でも 2 秒以内に起動できますが、サードパーティ製の gem はほとんど使用していません。

于 2010-09-19T20:48:30.887 に答える
2

Bundler は、gem を必要とする時間の半分以上を費やすことがよくあります。ロードしている依存関係の中に、開発/テスト モードで不要なものはありますか? たとえば、いくつかの gem は resque ワーカーまたは他のスクリプトでのみ使用されます。:require => false開発/テストモードでの適度な起動速度の向上のために、それらを追加してから、必要に応じて手動で要求することができます。

その前に、require ステートメント (lib/bundler/runtime.rb 内) をプロファイリングして、実際に取り出す価値があるかどうかを確認します。

于 2010-10-16T00:32:57.073 に答える
0

私は3つのRails 3アプリを持っており、2.3.8から1つを移行しています。Rails 2.3.8のロードは4秒で、Rails 3の途中にあるブランチには12秒かかり、他のすべてのRails 3プロジェクトは20からかかりますロードに 30 秒かかります。誰かが自分の Rails アプリを 3 秒でロードするスクリーンキャストを見ると、とても憂鬱です。Rails 3 に移行して以来、自分の環境だと思って髪を引っ張っています。

于 2011-04-12T20:09:23.927 に答える