Domanda

Lavorare su .NET mi dà buone prestazioni in generale per l'applicazione stessa, ma i tempi di caricamento iniziale per la mia applicazione sono piuttosto grandi. Molto è destinato al caricamento di assiemi che è difficile da misurare.

Esistono delle ottimizzazioni che posso applicare ai miei assembly per renderli più veloci da caricare senza coinvolgere GAC o Ngen e quelli non sono disponibili per ClickOnce?

Questo è un progetto WinForms 2.0. Posso aggiornarlo a 3.5 ma questo limita la mia base di utenti. Ho .NET Framework 3.5 installato sul mio computer.

È stato utile?

Soluzione

Ho creato un file .exe molto piccolo che mostra una schermata iniziale al più presto. Dopo di che ho inizializzato tutto.

Il compilatore JIT carica i moduli che vengono chiamati dal metodo che si sta eseguendo il jitting. Quindi devi fare attenzione che il metodo che mostra la schermata iniziale, non chiama metodi in moduli che non vuoi ancora caricare.

Esempio:

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
    }
}

Il [MethodImpl (MethodImplOptions.NoInlining)] è necessario in modo che il metodo ContinueStartup () non venga allineato da jit, perché ciò causerà il caricamento dei moduli troppo presto.

Altri suggerimenti

Puoi usare ILMerge per unire tutti i tuoi assembly in un unico file. La lettura di un file in memoria è più rapida della lettura di 10 file. Anche se dubito che vedrai un reale miglioramento della velocità di caricamento lì.

Puoi anche rimuovere tutti i riferimenti ad altri assembly, caricare l'interfaccia utente per l'utente e mentre usa l'interfaccia utente (digitando o qualcos'altro) precarica tutti gli assembly necessari usando Assembly.Load, ottieni tutti i puntatori di funzione necessari usando riflessione e memorizzarli nei membri interni. In questo modo l'applicazione si caricherà molto più velocemente. Ma non credo che nessuna persona sana farà l'ottimizzazione in questo modo.

Puoi descrivere il tuo numero di assemblee che hai?

.NET carica l'assembly al volo quando ne hai bisogno. Puoi decidere di dividere l'app in più assiemi. Le assemblee devono essere divise per mezzo di: strategia di implementazione, sicurezza e prestazioni. La maggior parte delle app sono divise in 3 livelli (UI, business, dati).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top