2011-10-03 41 views
6

當Rails啓動時,它會預加載它的所有依賴項(gems),這會導致啓動時間非常慢。在我正在開發的一箇中型項目中,Rails的開始時間是10-15秒,取決於機器。爲什麼Rails在啓動時預加載所有依賴項(gems)?

雖然這不是生產中的問題,但這是一個巨大的開發難題。特別是在工作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秒的加載時間,它只是在第一個請求上加上。不好,對吧?

您經歷的很多加載時間都在您添加到項目中的gem/plugins/libraries中。許多重要的大小提供了只加載你需要的部分的方法,更多的可以使用這種優化。例如,如果你有一個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

相關問題