Domanda

Ho notato che WPF avvio dell'applicazione è a volte molto lento.Qualcuno sa se la causa è gli elementi di inizializzazione Dll o di carico o di qualcos'altro?

È stato utile?

Soluzione

Il testo riportato di seguito è stato estratto dal questo articolo di MSDN di Migliorare il tempo di avvio delle applicazioni WPF (Edit:ora fusa in WPF Tempo di Avvio dell'Applicazione)

Tempo Di Avvio Dell'Applicazione

La quantità di tempo che è necessario per un'applicazione WPF per iniziare può variare notevolmente.In questo argomento vengono descritte le varie tecniche per ridurre la percezione e l'effettivo tempo di avvio di Windows Presentation Foundation (WPF) applicazione.

La comprensione di Avvio a Freddo e WarmStartup

Avvio a freddo si verifica quando l'applicazione viene avviata per la prima volta dopo un riavvio del sistema, o quando si avvia l'applicazione, chiudere, e quindi avviare di nuovo dopo un lungo periodo di tempo.Quando un'applicazione viene avviata, se le pagine richieste (codice, dati statici, di registro, ecc) non sono presenti nella gestione della memoria di Windows lista d'attesa, pagina verificarsi di guasti.L'accesso al disco è necessario per portare le pagine in memoria.

Avvio a caldo si verifica quando la maggior parte delle pagine principali di common language runtime (CLR) i componenti sono già caricati in memoria, che consente di risparmiare costose tempo di accesso al disco.Che è il motivo per cui un'applicazione gestita inizia più veloce quando si esegue una seconda volta.

Implementare una Schermata iniziale

Nei casi In cui vi è un significativo, inevitabile ritardo tra l'avvio di un'applicazione e visualizzare il primo UI, ottimizzare la percezione del tempo di avvio utilizzando un splash screen.Questo approccio consente di visualizzare un'immagine quasi immediatamente dopo che l'utente avvia l'applicazione.Quando l'applicazione è pronta a mostrare la sua prima UI, la schermata iniziale si affievolisce.A partire in .NET Framework 3.5 SP1, è possibile utilizzare il SplashScreen classe a implementare una schermata iniziale.Per ulteriori informazioni, vedere Come:Aggiungere una Schermata di un'Applicazione WPF.

È inoltre possibile implementare la propria schermata iniziale utilizzando nativo Win32 grafica.Display di attuazione prima dell' Eseguire viene chiamato il metodo.

Analizzare il Codice di Avvio

Determinare il motivo per un lento avvio a freddo.I/O del disco può essere responsabile, ma questo non è sempre il caso.In generale, si dovrebbe ridurre al minimo l'uso di risorse esterne, come la rete, i servizi Web, o su un disco.

Prima di eseguire il test, verificare che non vi siano altre applicazioni o l'esecuzione di servizi utilizzo di codice gestito o WPF codice.

Avviare l'applicazione WPF subito dopo un riavvio, e determinare il tempo necessario per la visualizzazione.Se tutti i successivi lanci di applicazione (avvio a caldo) sono molto più veloci, il freddo di avvio del problema è probabilmente causato da I/O.

Se la tua domanda di avvio a freddo problema non è correlato al di I/O, è probabile che l'applicazione esegue alcuni lunghi di inizializzazione o di calcolo, in attesa di un evento completo, o richiede un sacco di compilazione JIT all'avvio.Le sezioni seguenti descrivono alcune di queste situazioni in modo più dettagliato.

Ottimizzare Il Caricamento Del Modulo

Utilizzare strumenti come Process Explorer (Procexp.exe) e Tlist.exe per determinare quali moduli di applicazione dei carichi.Il comando Tlist <pid> mostra tutti i moduli che vengono caricati da un processo.

Per esempio, se non si collega al Web e vedi che System.Web.dll viene caricato, quindi c'è un modulo nell'applicazione che fa riferimento a questa assemblea.Controllare per assicurarsi che il riferimento è necessario.

Se l'applicazione dispone di più moduli, unirli in un unico modulo.Questo approccio richiede meno CLR assemblea-caricamento di overhead.Un minor numero di assemblee, significa anche che il CLR mantiene meno stato.

Rinviare Le Operazioni Di Inizializzazione

Prendere in considerazione il rinvio del codice di inizializzazione fino a dopo la finestra principale dell'applicazione viene eseguito il rendering.

Essere consapevoli del fatto che l'inizializzazione può essere eseguita all'interno di un costruttore della classe, e se il codice di inizializzazione riferimenti ad altre classi, può causare un effetto "a cascata" in cui molti costruttori di classe vengono eseguiti.

Evitare L'Applicazione Di Configurazione

È consigliabile evitare di configurazione dell'applicazione.Per esempio, se un'applicazione ha una semplice configurazione requisiti e ha stretto i tempi di avvio obiettivi, voci del registro di sistema o un semplice file INI può essere un avvio più veloce alternativa.

Utilizzare il GAC

Se un gruppo non è installato nella Global Assembly Cache (GAC), ci sono dei ritardi causati dalla verifica hash di assembly con nome sicuro e da Ngen immagine di convalida se un'immagine nativa per il montaggio è disponibile sul computer.Forte la verifica del nome è saltato, per tutte le assemblee installato nella global assembly cache.Per ulteriori informazioni, vedere Gacutil.exe (Strumento Global Assembly Cache).

Utilizzare Ngen.exe

Considerare l'utilizzo di Generatore di Immagini Native (Ngen.exe) sulla vostra applicazione.Utilizzando Ngen.exe mezzi trading consumo di CPU per di più l'accesso al disco, perché l'immagine nativa generata da Ngen.exe è probabile essere più grande MSIL immagine.

Per migliorare il tempo di avvio a caldo, si dovrebbe sempre utilizzare Ngen.exe per la vostra applicazione, perché questo evita il costo della CPU di compilazione JIT del codice dell'applicazione.

In alcuni di avvio a freddo scenari, utilizzando Ngen.exe può anche essere utile.Questo è perché il compilatore JIT (mscorjit.dll non deve essere caricato.

Avendo entrambi Ngen e JIT moduli di il peggiore effetto.Questo è perché mscorjit.dll deve essere caricato, e quando il compilatore JIT funziona sul tuo codice, molte pagine della Ngen le immagini devono essere accessibili quando il compilatore JIT legge assemblee dei metadati".

Ngen e ClickOnce

Il modo in cui si prevede di distribuire l'applicazione può anche fare la differenza nel tempo di caricamento.La distribuzione di applicazioni ClickOnce non supporta Ngen.Se si decide di utilizzare Ngen.exe per la vostra applicazione, si dovrà utilizzare un altro meccanismo di distribuzione, come ad esempio Windows Installer.

Per ulteriori informazioni, vedere Ngen.exe (Generatore Di Immagini Native).

La riassegnazione e DLL Indirizzo Collisioni

Se si utilizza Ngen.exe essere consapevoli del fatto che la riassegnazione può verificarsi quando il nativo immagini vengono caricate in memoria.Se una DLL non viene caricato all'indirizzo di base preferenziale perché intervallo di indirizzi è già assegnato, il caricatore di Windows viene caricato in un altro indirizzo, che può essere un'operazione che richiede molto tempo.

È possibile utilizzare l'Indirizzo Virtuale Dump (Vadump.exe strumento per controllare se ci sono dei moduli in cui tutte le pagine sono private.Se questo è il caso, il modulo può essere stata riassegnata a un indirizzo diverso.Pertanto, le sue pagine non può essere condivisa.

Per ulteriori informazioni su come impostare l'indirizzo di base, vedere Ngen.exe (Generatore Di Immagini Native).

Ottimizzare Authenticode

Authenticode verifica aggiunge il tempo di avvio.Authenticode-firmato assemblee devono essere verificati con l'autorità di certificazione (CA).Questa verifica può essere che richiede tempo, perché può richiedere la connessione alla rete più volte a scaricare attuali elenchi di revoca del certificato.Assicura, altresì, che vi è una completa catena di certificati validi sul percorso da una fonte attendibile.Questo può tradurre per diversi secondi di ritardo, mentre l'assemblea è stata caricata.

Considerare la possibilità di installare il certificato della CA sul computer client, o evitare l'uso di Authenticode quando è possibile.Se sai che la tua applicazione non è necessario che l'editore prove, non è necessario pagare il costo della verifica della firma.

A partire da .NET Framework 3.5, c'è un opzione di configurazione che permette il Authenticode verifica per essere ignorata.Per fare questo, aggiungere la seguente impostazione per l'app.exe.file di configurazione:

<configuration>
 <runtime>
    <generatePublisherEvidence enabled="false"/>
  </runtime>
</configuration>

Confrontare le Prestazioni di Windows Vista

La gestione della memoria in Windows Vista dispone di una tecnologia chiamata SuperFetch.SuperFetch analizza l'utilizzo della memoria i modelli più tempo per determinare l'ottimale del contenuto della memoria per un utente specifico.Si lavora costantemente per mantenere il contenuto a tutti i tempi.

Questo approccio è diverso da quello pre-fetch tecnica utilizzata in Windows XP, che vengono precaricati i dati in memoria, senza analizzare i modelli di utilizzo.Nel corso del tempo, se l'utente utilizza l'applicazione WPF spesso su Windows Vista, il tempo di avvio a freddo dell'applicazione potrebbe migliorare.

Utilizzare Dominare In Modo Efficiente

Se possibile, il carico di assembly in un dominio neutro codice di zona per assicurarsi che l'immagine nativa, se esiste, è utilizzato in tutti i domini applicazione creata nell'applicazione.

Per prestazioni ottimali, applicare efficace cross-dominio di comunicazione, riducendo chiamate cross-domain.Quando possibile, utilizzare le chiamate senza argomenti o primitivi che tipo di argomenti.

Utilizzare l'Attributo NeutralResourcesLanguage

Utilizzare il NeutralResourcesLanguageAttribute specificare la lingua per il ResourceManager.Questo approccio evita riuscita assemblea ricerche.

Utilizzare la Classe BinaryFormatter per la Serializzazione

Se è necessario utilizzare la serializzazione, utilizzare il BinaryFormatter classe invece di XmlSerializer classe.Il BinaryFormatter la classe è implementato nella Libreria di classi Base (BCL) in mscorlib.dll l'assemblaggio.Il XmlSerializer è implementato nel System.Xml.dll assemblea, che potrebbe essere un ulteriore caricamento della DLL.

Se è necessario utilizzare il XmlSerializer classe, è possibile ottenere prestazioni migliori, se si pre-generare l'assembly di serializzazione.

Configurare ClickOnce per Controllare gli Aggiornamenti Dopo l'Avvio

Se l'applicazione utilizza ClickOnce, evitare di accesso alla rete in avvio di configurando ClickOnce per verificare l'implementazione del sito per gli aggiornamenti dopo l'avvio dell'applicazione.

Se si utilizza l'applicazione browser XAML (XBAP) modello, tenere a mente che ClickOnce verifica l'implementazione del sito per aggiornamenti, anche se l'applicazione XBAP è già nella cache di ClickOnce.Per ulteriori informazioni, vedere La Protezione e la Distribuzione ClickOnce.

Configurare il PresentationFontCache Avvio Automatico del Servizio

La prima applicazione WPF per l'esecuzione dopo un riavvio è il PresentationFontCache servizio.Il servizio memorizza nella cache i font di sistema, migliora il font di accesso, e migliora le prestazioni complessive.C'è un sovraccarico di avvio del servizio, e in alcuni ambienti controllati, si consiglia di configurare il servizio per avviare automaticamente quando il sistema viene riavviato.

Impostare L'Associazione Dati A Livello Di Programmazione

Invece di usare XAML per impostare il DataContext in modo dichiarativo per la finestra principale, considerare la possibilità di impostare a livello di programmazione nel OnActivated metodo.

Altri suggerimenti

Il tempo di avvio di un'applicazione WPF può essere molto più veloce se si utilizza Framework 3.51 e non 3.5 o 3.0. Il 3.51 è davvero un miglioramento.

Il consiglio più utile che fissa le prestazioni di avvio WPF che abbia mai visto è stato dato in quest'altra domanda : eseguito "update ngen" in ogni cartella quadro.

Sembra che Microsoft non riesce a tenere il loro nascondiglio ngen up-to-date, che si traduce nell'applicazione praticamente la metà ricompilare il framework .NET ogni avvio.

Difficile da credere, ma sembra essere vero.

Questo è un vecchio thread, ma ho finito qui diverse volte durante il tentativo di risolvere un problema di prestazioni di avvio con le applicazioni WPF sul mio sistema Win10, così ho pensato di Premetto una risposta che può aiutare gli altri - una risposta che prende un orribile 5 secondi il tempo di avvio di tutte le applicazioni WPF su questo sistema fino a pochi millisecondi. Rimuovi il driver nVidia "3D Vision" . Ho un GeForce GTX 650 scheda e il driver "3D Vision" non sembra offrire qualcosa di utile, quindi la rimozione non è un problema per me. Lo strumento di analisi delle prestazioni VisualStudio2015 finalmente aiutato mostrano che quasi tutto il tempo 5 secondi di avvio è stato speso IDLE dopo una chiamata attraverso nvapi64.dll - il driver nVidia. Wow.

La cosa che mi ha aiutato di più l'eccellente articolo che i collegamenti Stuart a era il trucco XmlSerializer. Che davvero rasata di un bel paio di secondi. Inoltre non sottovalutare la deframmentazione del HD: -)

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