1

.NET で作業すると、アプリケーション自体のパフォーマンスは全般的に向上しますが、アプリケーションの初期ロード時間が非常に長くなります。その多くは、測定が困難なアセンブリのロードに使用されます。

アセンブリに適用して、GAC や Ngen を使用せずに読み込みを高速化できる最適化はありますか? ClickOnce では利用できません。

これは WinForms 2.0 プロジェクトです。3.5 にアップグレードできますが、それではユーザー ベースが制限されます。マシンに .NET Framework 3.5 がインストールされています。

4

3 に答える 3

2

スプラッシュ画面をすぐに表示する非常に小さな .exe を作成しました。その後、すべてを初期化します。

JIT コンパイラは、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)] が必要であるため、JIT によって ContinueStartup() メソッドがインライン化されません。これにより、モジュールのロードが早すぎるためです。

于 2009-03-08T23:23:01.050 に答える
1

ILMerge を使用して、すべてのアセンブリを 1 つのファイルにマージできます。1 つのファイルをメモリに読み込む方が、10 個のファイルを読み込むよりも高速です。読み込み速度が実際に改善されるとは思えませんが.

また、他のアセンブリへのすべての参照を削除し、UI をユーザーにロードし、ユーザーが UI (入力など) を使用している間に、Assembly.Load を使用して必要なすべてのアセンブリをプリロードし、必要なすべての関数ポインターをリフレクションとストアを使用して取得することもできます。それらを内部メンバーに入れます。この方法では、アプリケーションの読み込みがはるかに高速になります。しかし、正気な人がこのような最適化を行うとは思いません。

于 2009-03-08T22:41:13.350 に答える
0

アセンブリの数を教えてください。

.NETは、必要なときにその場でアセンブリをロードします。アプリをいくつかのアセンブリに分割することを決定できます。アセンブリは、展開戦略、セキュリティ、およびパフォーマンスによって分割する必要があります。ほとんどのアプリは、3つの階層構造(UI、ビジネス、データ)で分割されています。

于 2009-03-09T07:33:30.667 に答える