なぜASP.NETの再コンパイル(再JIT)すべての時に一つだけの変更をしますか?
-
20-08-2019 - |
質問
私は私が入れている(2005年のVisual Studioで、「ウェブサイト」としてコンパイルし、プリコンパイル/ Webデプロイメントプロジェクトを使用してパッケージ化された(MSIからIIS 6.0にインストールされている)ASP.NET 2.0アプリケーションを持っています)開発者への要求は、次のバージョンのためのWebアプリケーションに変更することを検討するために、それは、このバージョンでは変更されません。
アプリケーションが最初のヒットに、(例えば、変化がweb.configファイルに対して行われる)再循環されるたびに、ASP.NET用のJITアプリケーション。その一環として、それは、ログインページに必要なすべてのアセンブリをとり、20〜60秒かかりASP.NETの一時ファイルの「アセンブリの\ DL3」ディレクトリ内のネイティブコードにコンパイルします。これはまれにしか起きリサイクル、上で起こる - 。しかし、それがないとき、それはロードするために非常に長い時間がかかるためにページを引き起こし、私はこれを最適化することが可能であると考えています。
プリコンパイルされたコードビハインドているそのうちのいくつかは、それは検討する必要があると122個のDLL、があるように見えるが、他の人がウェブサイトのためのサードパーティのコンポーネントです(コンポーネントを報告する例えば、NHibernate.dll、など。)
なぜそれが再コンパイルん/再JIT のすべてのの?なぜそれがアセンブリのほとんどが変更されていないことを検出していないし、それらを変更しようとしないのですか?私はそれが問題を引き起こしているバッチコンパイルではないことを証明することはできますか? (私は> web.configファイルで設定<compilation debug="false"
ています。)
その他の質問ASP.NET 1.xの上でそれを使用します。我々は2.0を使用していると私はきれいな答えにいずれかの方法を見つけることができません。
解決
は、私の個人的な経験から、ゆっくりとリサイクルは、多くの場合、NHibernateは/ ActiveRecordのが原因です。 http://nhibernate.info/blogを参照してください。説明+可能な解決策のための/2009/03/13/an-improvement-on-sessionfactory-initialization.htmlするます。
他のヒント
は、IISを実行していますか?私はあなたがIISでサイトを再起動した場合、それはDLLをコピーせずにコンフィグに変更をピックアップすることをかなり確信しています。
あなたはあまり変化しない一般的なDLLをインストールしてリサイクルタイムを向上させることができます。それは再JITコンパイルされてからそれらを防ぐ必要があります。
する方法:グローバルアセンブリキャッシュするにアセンブリをインストールします。
これはのみのDLLをコピーする20秒かかることを奇妙です。私は別のチェックを行い、ボトルネックがどこにあるかを確認することをお勧めします。
どのようにしてAppDomainのすべてがリセット/リサイクルせずに適切な状態であること(または起こるものは何でも)特定することができますか?あなたが設定値に基づいて、静的フィールドの値を設定し、アプリケーションの起動(Global.asaxの)中に何かを持っているイメージング。あなたは全体のAppDomainをリセットしない限り、あなたは確認することはできません。
もう一つの理由:。そこにそのロードされた後、.NETのDLLをアンロードする方法はありませんので、あなたが何かが更新されたときにアプリケーションドメインを再作成する必要があります。