質問
.NETで作業すると、一般にアプリケーション自体のパフォーマンスが向上しますが、アプリケーションの初期ロード時間は非常に長くなります。その多くは、測定が困難なアセンブリのロードに使用されます。
GACまたはNgenを使用せずにロードを高速化するためにアセンブリに適用できる最適化はありますか?それらはClickOnceでは使用できませんか?
これはWinForms 2.0プロジェクトです。 3.5にアップグレードできますが、ユーザーベースが制限されます。 マシンに.NET Framework 3.5がインストールされています。
解決
スプラッシュスクリーンをできるだけ早く表示する非常に小さな.exeを作成しました。その後、すべてを初期化します。
JITコンパイラーは、ジッターされているメソッドから呼び出されるモジュールをロードします。そのため、スプラッシュ画面を表示するメソッドは、まだロードしたくないモジュールのメソッドを呼び出さないように注意する必要があります。
例:
internal sealed class Startup {
// Call Startup.Run() from Program.Main to start the application
internal void Run() {
this.ShowSplash();
this.ContinueStartup();
}
private void ShowSplash() {
_splash = new Splash();
_splash.Show();
Application.DoEvents();
}
[MethodImpl(MethodImplOptions.NoInlining)]
private void ContinueStartup() {
// Do the startup here
}
}
[MethodImpl(MethodImplOptions.NoInlining)]が必要であるため、ContinueStartup()メソッドはjitによってインライン化されません。モジュールの読み込みが早すぎるためです。
他のヒント
ILMergeを使用して、すべてのアセンブリを1つのファイルにマージできます。 1つのファイルをメモリに読み込む方が、10個のファイルを読み込むよりも高速です。読み込み速度が実際に改善されるとは思いませんが。
他のアセンブリへのすべての参照を削除し、UIをユーザーにロードし、ユーザーがUI(入力など)を使用しながら、必要なすべてのアセンブリをAssembly.Loadを使用してプリロードし、反映し、内部メンバーに保存します。この方法により、アプリケーションははるかに高速にロードされます。しかし、正気な人がこのような最適化を行うとは思わない。
所有しているアセンブリの数を説明できますか?
.NETは、必要なときにその場でアセンブリをロードします。アプリを複数のアセンブリに分割することができます。アセンブリは、展開戦略、セキュリティ、およびパフォーマンスによって分割する必要があります。ほとんどのアプリは、3層構造(UI、ビジネス、データ)で分割されています。