自動ロードは、「必要なすべてのクラス/メソッド/ライブラリをインポートする」を「特定の場所にファイルを配置すると、それらを見つけることができる」に置き換える方法にすぎません。
基本的なアルゴリズムは、「クラスまたはモジュールを使用し、それが見つからない場合、見つからないことを伝える前に、これらのパスのいずれかで検索する」のようなものです。
オートローディングは 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: 自動読み込みのパフォーマンスについて心配する必要はありません。アプリのパフォーマンスを犠牲にして開発モードで役立ち、開発速度を犠牲にして実稼働モードでパフォーマンスを向上させます。