2012-10-19 50 views
4

我是Rails的新手,這可能是一個愚蠢的問題,但我不知道如何影響Rails應用性能的寶石數量?它增加的寶石變得越慢嗎?所有寶石都會在每個請求中被調用?如何影響Rails應用程序性能的寶石數量?

我在問這個問題,因爲,例如,在Django中,你在調用它的每個.py文件中導入每個需要的類/方法/庫。在Rails中,你沒有這樣做,所有東西都是「自動加載」的,但我想知道,這種「自動加載」的成本是多少?

這是否意味着每個請求都會調用所有gems get?

回答

10

自動加載僅僅是一種將「將所有需要的類/方法/庫導入」替換爲「如果將文件放在特定位置,我們可以找到它們」的方法。

基本算法類似於「如果您使用類或模塊並且找不到,在我們告訴您找不到它之前,請在這些路徑之一中搜索它」。

自動加載正交於尋找寶石,而是尋找您的應用程序的代碼。換句話說,在應用程序啓動時,您的Gem文件會從您的Gemfile中加載並需要一次,但自動加載機制不是運行在gem上,而是運行在您應用程序的代碼上。

所以要回答你的問題的第一部分:寶石加載與自動加載沒有直接關係。在應用程序中包含新寶石可能會使應用程序啓動速度稍慢,因爲找到並分析了該庫,但它們在啓動後始終加載;它不會影響您的每個請求的性能。

這是很好的瞭解,RubyGems的是紅寶石的一部分,而自動加載是的Rails的一部分:Rails的是寫在Ruby之上的框架,以同樣的方式Django是寫在Python之上的框架,但Ruby和Rails非常獨特。寶石是Ruby的一部分,自動加載是Rails的一部分。

自動加載旨在加快開發速度;如果您按照目錄佈局約定重新加載服務器,而不必每次請求都重新加載文件(並且只有應用中的文件)。這很好,因爲您可以在開發時讓服務器保持運行。

值得注意的是,這是真的僅在開發模式。在生產模式下,它會查找文件是否只丟失一次,並在請求中記住它,以便爲每個請求節省文件系統搜索的開銷。事實上,如果您使用的是Rails 3.2或更高版本,即使在開發模式下,它也會變得足夠聰明,只有在自上次請求以來發生更改的情況下才重新加載該文件,從而在開發過程中加快速度。

你不要使用自動加載,順便說一句:你可以手動require你需要的文件,就像你談論Python一樣。這是Ruby的標準做法。這會繞過自動加載該文件,因爲你的常量永遠不會「未找到」:這樣做會很好,因爲它會提高應用程序的性能,但是很糟糕,因爲每次更改代碼時都必須重新啓動應用程序。

tl; dr:不要擔心自動加載性能。它將以應用程序性能爲代價幫助您進入開發模式,並以開發速度爲代價在生產模式下高效運行。

+0

感謝您的解釋! – Timus83

1

寶石影響你的Rails應用程序的性能在以下幾個方面的數字:

  • 當啓動您的應用程序/加載環境中的所有寶石都被加載。如果有更多的寶石,這個加載 顯然需要更長的時間。在開發過程中你會特別注意到這一點,因爲你會很多次加載你的環境(比如希望每次運行單元測試時)。
  • 更多(加載)代碼也需要更多空間,因此如果您使用更多寶石,您的應用程序將消耗更多內存。

這兩點都比較微妙,你不會注意到加載5個或10個寶石之間的區別。但一旦你達到像20或50寶石的數字,你會開始注意到...

+0

感謝您的信息! – Timus83

相關問題