2009-06-03 12 views
3

各/ binフォルダに30個のDLLを持つ1000個のasp.net Webサイトがある場合は、グローバルアセンブリキャッシュを使用して速度を増やす

したがって、30,000のDLLです。

グローバルアセンブリキャッシュに1組のDLLを登録し、各サイトがGACでDLLを使用した場合、Webサイト/ Webサーバー/マシンが高速で動作しますか?

ウェブサイトの総使用メモリが少なくなりますか?

答えて

7

アセンブリはGACにありますが、アセンブリから独立してメモリにロードされます。つまり、アセンブリがGACにあるという理由だけで、これらのコピーがAppDomainsで共有されるわけではありません。私は、mscorlib(場合によってはいくつかのBCLアセンブリ)は、AppDomains全体で共有されるでも構いませんが、あなたまたは私が書くアセンブリは存在しません。

ただし、これは良いことです。CacheタイプがAppDomainsで共有されていることを考慮してください。

+2

アセンブリはLoaderOptimizationAttributeを使用してドメイン中立としてロードすることができます。私はこれを行うことの意味を正確には分かっていませんが、AppDomains全体での状態の共有に関係しているとは考えていません。 – Josh

+0

右の属性は、実行可能ファイルのエントリポイントでのみ有効です。つまり、ライブラリには影響しません。 –

+0

ああ良い点。しかし、確かにASP.NETはドメイン中立のロードを可能にするためにCLRホストを設定しましたか?さもなければ、複数のプロジェクトで使用されている共有.DLLを持つ組織では、各DLLのメモリに別々のコピーをロードする必要がありますか?明らかに、各appdomainは独自の状態を必要としますが、コード自体は2回読み込まれますか? – Josh

1

NGENの場合には、これははるかに高速です。 NGENをグローバルアセンブリキャッシュに入れないと、CLRがネイティブイメージに一致することを確認するためにアセンブリの検証を実行する必要があるため、実際には処理が遅くなります。 CLRはGACのアセンブリのチェックをスキップし、ネイティブイメージをロードして使用します。

NGENアセンブリには、コードページを共有できるため、メリットもあります。

DLLのベースアドレスをすべて最適化しようとすると、デフォルトを使用している場合、Windowsは30,000回リベースする必要があります。

ここには、NGENのパフォーマンス上の利点に関する素晴らしい記事があります。

http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

+0

ええええええ、NGENを通してそれらを実行し、おそらくベースアドレスを変更することは助けになるかもしれませんが、GACだけに1万のDLLを置くだけです –

+0

GACのアセンブリのパフォーマンスの向上は、アセンブリの名前が強く、強力な名前の検証が有効になっているかどうかと関係していると思います。 CLRは最初にGACでアセンブリを調べるので、そこでは若干の改善が見られるでしょう。大きな改善は、NGENとおそらくベースアドレスから来ています。 – Josh

関連する問題