2009-03-19 8 views
4

"Webサイト"としてコンパイルされ、Visual Studio 2005でWebデプロイメントプロジェクトを使用してプリコンパイル/パッケージ化されたASP.NET 2.0アプリケーション(MSIのIIS 6.0にインストールされている)があります。開発者に、次のバージョンのWebアプリケーションへの変更を検討するよう依頼しますが、このバージョンでは変更されません)。なぜ、ASP.NETが1つだけ変更されたときにすべてを再コンパイル(再JIT)するのですか?

アプリケーションがリサイクルされると(たとえば、web.configに変更が加えられたとき)、最初にヒットすると、ASP.NETはアプリケーションをJITします。その一環として、ログインページに必要なすべてのアセンブリを取得し、テンポラリASP.NETファイル 'assembly \ dl3'ディレクトリのネイティブコードにコンパイルします(20〜60秒かかる)。これはごくまれにしか発生しないリサイクルでのみ発生しますが、そうするとページの読み込みに時間がかかりますが、最適化することは可能かもしれません。

いくつかはプリコンパイルされたコードビハインドであり、その他はWebサイトのサードパーティコンポーネントです(たとえば、NHibernate.dll、レポートコンポーネントなど)。

なぜ再コンパイル/再JIT すべて?アセンブリのほとんどが変更されていないことを検出せず、変更しようとしないのはなぜですか?問題の原因となっているバッチ編集ではないことを証明できますか? (私は<compilation debug="false"がweb.configに設定されています)

Other questions NGENが役に立ちそうですが、ASP.NET 1.xで使用することはできません。私たちは2.0を使用していますが、いずれの方法でもきれいな答えが見つかりません。

答えて

2

。解説+可能な解決方法については、http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.htmlを参照してください。

+0

Nice find、+1。私はNHのパッチ(城は使用していません)を見つけようとしています。あなたはそれを持っていることがありますか? – crb

+0

残念ながら、私はすぐにFluent NHibernateに追加しようとします。しかし約束はない。 – felixg

+0

Heh。新しいNHパターンのこれらの修正は、私が市販されている製品の旧バージョンでは使用できないものです。私はOSSクイックアップデートの世界をもっと好みます:) – crb

2

IISを実行していますか?私は、あなたがIISであなたのサイトを再起動すると、dllをコピーせずにconfigsへの変更を拾うことはかなり確信しています。

+0

はい、アプリケーションはIIS 6.0で実行されています。 configを変更すると、すべてのDLLが再コピーされます。 IISを停止して変更を行った場合、出力が何であるか分かりません。 – crb

+0

本当に、本当に。それでは、気にしないでください。 (私はIISの経験がほとんどなく、IIS7のみを使用しています) –

0

dllをコピーするだけで20秒かかります。もう一度チェックし、ボトルネックがどこにあるかを確認することをお勧めします。

+0

これは1つのDLLではなく、122種類です。 26MBの価値。それはいつも時間がかかるでしょう。彼らが変わっていなければ、私はむしろそれをやりたいと思っていました! – crb

+0

標準のHDでは、26MBは2〜3秒でコピーする必要があります。私は問題は、アプリケーションの事前コンパイルとアプリケーションの起動時に発生する可能性があるすべての初期化コードだと思います。 – Albert

+0

あなたは正しいです、それは約その時間にディレクトリをコピーしました。しかし、私はプロセスモニタの出力以外のものから当時何をしているのか分からないので、私は他のアイデアに興味があります... – crb

2

頻繁に変更されない一般的なDLL(NHibernateやレポートツールなど)をGACにインストールすることで、リサイクル時間を改善できます。それは彼らが再挑戦するのを妨げるはずです。私の個人的な経験、あなたがエンティティの多くを持っている場合、低速リサイクルは、多くの場合、NHibernateは/ ActiveRecordのが原因ですから、

How to: Install an Assembly into the Global Assembly Cache

0

AppDomainをリサイクル/リセットしなくても、すべてが適切な状態になっていることをどのように確認できますか?イメージングでは、アプリケーションの開始時に(global.asax)、設定値に基づいて静的フィールドの値を設定するものがあります。 AppDomain全体をリセットしない限り、わからないことがあります。

もう1つの理由:.NET dllがロードされてからアンロードする方法がないため、何かが更新されたときにアプリケーションドメインを再作成する必要があります。

関連する問題