.net アセンブリのサイズはパフォーマンスに影響しますか? Windows フォーム/Web フォーム プロジェクトのアセンブリ数はどうですか?
9 に答える
.NETアプリケーションのパフォーマンスとスケーラビリティを向上させるMicrosoftのパターンと実践から第5章:
複数の小さなアセンブリよりも単一の大きなアセンブリを優先する
アプリケーションのワーキングセットを減らすために、複数の小さなアセンブリではなく、単一の大きなアセンブリを選択する必要があります。常に一緒にロードされる複数のアセンブリがある場合は、それらを組み合わせて1つのアセンブリを作成する必要があります。
複数の小さなアセンブリを持つことに関連するオーバーヘッドは、次の原因による可能性があります。
- 小さなアセンブリのメタデータをロードするコスト。
- アセンブリをロードするために、CLRでプリコンパイルされたイメージのさまざまなメモリページにアクセスします(Ngen.exeでプリコンパイルされている場合)。
- JITコンパイル時。
- セキュリティチェック。
プログラムがアクセスするメモリページに対してのみ料金を支払うため、アセンブリが大きいほど、ネイティブイメージジェネレータユーティリティ(Ngen.exe)が生成するネイティブイメージを最適化する可能性が高くなります。画像のレイアウトが優れているということは、必要なデータをより密にレイアウトできることを意味します。つまり、複数のアセンブリに配置された同じコードと比較して、ジョブを実行するために必要なページ全体が少なくなります。
アセンブリの分割を避けられない場合があります。たとえば、バージョン管理と展開の理由で。タイプを個別に出荷する必要がある場合は、個別のアセンブリが必要になる場合があります。
まあ、アセンブリが読み込まれるたびに、解決のペナルティが原因でヒットが発生します-正しいファイルの検索、バージョン番号の確認など。これは主に起動時に発生する可能性があります.
ただし、「定常状態」のパフォーマンスに大きな影響を与えるとは思いません。
コンパクトなフレームワーク DLL は、サイズに関係なく、常に 64 KB の最小メモリ空間にロードされます。したがって、4 つの個別の 10 kb CF DLL をロードすると、デバイスで 256 kb のコストがかかります。それらを組み合わせた場合 ( ILMerge )、デバイス上のメモリは 64 kb しかかかりません。
アセンブリのサイズまたは数まで追跡したパフォーマンスへの重大な影響に遭遇したことはありません。私が追跡した重大なパフォーマンスの問題の大部分は、アルゴリズムの弱点が原因でした。
Jon Skeet が言うように、起動時の解像度により、小さなヒットが発生する可能性があります。lassevk には、リフレクションによるアセンブリの動的解決に関するポイントもあります。ただし、これらのいずれも、プログラムの過程でパフォーマンスに 2 回以上影響を与えるべきではありません。また、非常に厳しいパフォーマンスの制約の下で作業していない限り、通常の過程では、おそらくパフォーマンスに大きな影響を与えることはありません。
おそらく、問題に関する追加のコンテキストが役立つでしょう。たとえば、多くの大きなアセンブリを含むソフトウェアがあり、それを高速化しようとしているために、この質問をしているのですか?
測定可能な程度までパフォーマンスに影響を与えるとは思えません。起動時にロードするとペナルティが発生します。メモリ使用量はおそらく1〜2 MB増加しますが、それ以外はありません。まあ、これが原因で苦しむコードを自分で作成しない限り。
とは言っても、私はテストを見たことがないので、間違っているかもしれません。
Dan の回答に同意し、もう少し情報を追加します。その観点をサポートする別の関連ブログ投稿を次に示します。
私が知っていることの1つは、少なくともアセンブリのサイズがクラスやメソッドなどの数に関連している場合、アセンブリのサイズに関連してパフォーマンスに影響を与えることです.
リフレクションを使用し、すべてのアセンブリのようにループを使用する場合、それらのアセンブリのすべての型について、それらに属性があるかどうかなどを確認します。これにより、静的コンストラクターが JIT され、場合によってはこれらが呼び出されます。
ああ、ジョンの答えを見て、言及するのを忘れていました。もちろん、コードの JIT はコードの断片ごとに 1 回だけ行われるため、型を反映するだけで、あとでそれらに触れない場合、アセンブリのサイズはそのリフレクション ループの期間に影響しますが、その後はそれはまったく問題ではありません。
いいえ、影響はありません
未使用のローカル変数と不要な割り当てにより、アセンブリのサイズが大きくなり、パフォーマンスが低下します。