5

私は Rails の初心者で、これはばかげた質問かもしれませんが、Gem の数が Rails アプリのパフォーマンスにどのように影響するのだろうか? ジェムを追加すると遅くなりますか? リクエストごとにすべての宝石が呼び出されますか?

たとえば、Djangoでは、それを呼び出すすべての.pyファイルに必要なすべてのクラス/メソッド/ライブラリをインポートするため、この質問をしています。Railsではこれを行っていません。すべてが「自動ロード」されていますが、そのような「自動ロード」のコストはいくらですか?

リクエストごとにすべての gem が呼び出されるということですか?

4

2 に答える 2

12

自動ロードは、「必要なすべてのクラス/メソッド/ライブラリをインポートする」を「特定の場所にファイルを配置すると、それらを見つけることができる」に置き換える方法にすぎません。

基本的なアルゴリズムは、「クラスまたはモジュールを使用し、それが見つからない場合、見つからないことを伝える前に、これらのパスのいずれかで検索する」のようなものです。

オートローディングは gem を見つけることとは直交していますが、アプリケーションのコードを見つけることではありません。つまり、gem はアプリの起動時に一度 Gemfile から読み込まれ、必要とされますが、自動読み込みメカニズムは gem ではなく、アプリのコードで動作します。

したがって、質問の最初の部分に答えるには、gem の読み込みは自動読み込みとは直接関係ありません。アプリに新しい gem を含めると、ライブラリが検出されて解析されるため、アプリの起動が少し遅くなる可能性がありますが、起動後は常に読み込まれます。リクエストごとのパフォーマンスには影響しません。

RubyGems はRubyの一部であり、オートローディングはRailsの一部であることを知っておくとよいでしょう: Rails は Ruby の上に書かれたフレームワークであり、Django が Python の上に書かれたフレームワークであるのと同じように、Ruby と Rails は非常に異なっています。 . Gem は Ruby の一部であり、オートローディングは Rails の一部です。

オートローディングは、開発を高速化することを目的としています。変更を行うたびにサーバーを再起動する代わりに、ディレクトリ レイアウトの規則に従えば、要求ごとにファイル (およびアプリ内のファイルのみ)再読み込みされます。開発中はサーバーを実行したままにしておくことができるため、これは良いことです。

これは開発モードでのみ当てはまることに注意してください。実稼働モードでは、ファイルが 1 回だけ欠落している場合にファイルを見つけて、すべての要求でファイルシステムを検索するオーバーヘッドを節約するために、要求全体でそれを記憶します。実際、Rails 3.2 以降を使用している場合は、開発モードでも、前回のリクエスト以降にファイルが変更された場合にのみファイルをリロードできるようになり、開発中はさらに高速になります。

ところで、オートローディングを使用する必要はありません。Pythonrequireで話したのと同じように、必要なファイルを手動で行うことができます。これは Ruby の標準的なやり方です。これにより、定数が「見つからない」ことがないため、そのファイルの自動ロードが完全に回避されます。これは、アプリのパフォーマンスが向上するという点で優れていますが、コードを変更するたびにアプリを再起動する必要があるため、良くありません。

tl;dr: 自動読み込みのパフォーマンスについて心配する必要はありません。アプリのパフォーマンスを犠牲にして開発モードで役立ち、開発速度を犠牲にして実稼働モードでパフォーマンスを向上させます。

于 2012-10-19T17:34:55.543 に答える
1

gem の数は、 Railsアプリのパフォーマンスに次のように影響します。

  • アプリの起動時/環境のロード時に、すべての gem をロードする必要があります。gem の数が多いほど、この読み込みには明らかに時間がかかります。開発中に特にこれに気付くでしょう。なぜなら、環境を (できれば) 何度も (たとえば、単体テストを実行するたびに) ロードするからです。
  • より多くの (ロードされた) コードもより多くのスペースを必要とするため、より多くの gem を使用すると、アプリはより多くのメモリを消費します。

どちらの点もかなり微妙で、5 つまたは 10 個のジェムをロードしても違いに気付かないでしょう。しかし、宝石が 20 個や 50 個などの数に達すると、気付き始めます...

于 2012-10-19T21:25:34.253 に答える