當Rails啓動時,它會預加載它的所有依賴項(gems),這會導致啓動時間非常慢。在我正在開發的一箇中型項目中,Rails的開始時間是10-15秒,取決於機器。爲什麼Rails在啓動時預加載所有依賴項(gems)?
雖然這不是生產中的問題,但這是一個巨大的開發難題。特別是在工作TDD/BDD時。有加速測試的解決方案(如spork),但它們會引入他們自己的問題。
我的問題是:爲什麼不需要每個代碼文件中所需的依賴項,而不是在啓動時預加載所有內容?
手動需要什麼缺點?額外的代碼行?
當Rails啓動時,它會預加載它的所有依賴項(gems),這會導致啓動時間非常慢。在我正在開發的一箇中型項目中,Rails的開始時間是10-15秒,取決於機器。爲什麼Rails在啓動時預加載所有依賴項(gems)?
雖然這不是生產中的問題,但這是一個巨大的開發難題。特別是在工作TDD/BDD時。有加速測試的解決方案(如spork),但它們會引入他們自己的問題。
我的問題是:爲什麼不需要每個代碼文件中所需的依賴項,而不是在啓動時預加載所有內容?
手動需要什麼缺點?額外的代碼行?
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
削減負荷(避免關於數據庫的錯誤不存在)。
http://stackoverflow.com/questions/3418895/how-to-reload-all-gems-in-rails-3 – jimworm
考慮在TDD風格下使用自動測試或類似的工具。 – taro
@taro我正在使用guard-rspec(與autottest做同樣的事情),但這對啓動時間沒有幫助。 – arikfr