Sto cercando di ottimizzare la mia applicazione affinché funzioni bene subito dopo l'avvio. Al momento, la sua distribuzione contiene 304 binari (incluse le dipendenze esterne) per un totale di 57 megabyte. È un'applicazione WPF che esegue principalmente l'accesso al database, senza calcoli significativi.In che modo le prestazioni di compilazione .NET JIT (inclusi i metodi dinamici) sono influenzate dalle opzioni di debug dell'immagine del compilatore C#?
Ho scoperto che la configurazione di Debug offre tempi migliori (~ 5 volte di guadagno) per la maggior parte delle operazioni, poiché vengono eseguite per la prima volta durante il ciclo di vita del processo dell'applicazione. Ad esempio, l'apertura di uno specifico schermo all'interno dell'app richiede 0,3 secondi per NGENed Debug, 0,5 secondi per JITted Debug, 1,5 secondi per NGENed Release e 2,5 secondi per JITted Release.
Comprendo che il divario nel tempo di compilazione JIT è causato dal compilatore JIT che applica ottimizzazioni più aggressive per i binari di rilascio. Da quello che posso dire, le configurazioni di Debug e Release differiscono dagli switch /p:DebugType
e /p:Optimize
passati al compilatore C#, ma vedo lo stesso divario di prestazioni anche se costruisco l'applicazione con /p:Configuration=Release /p:DebugType=full /p:Optimize=false
- ovvero, le stesse opzioni di debug dell'immagine come in /p:Configuration=Debug
.
Confermo che le opzioni sono state applicate osservando lo DebuggableAttribute
applicato all'assieme risultante. Osservando l'uscita NGEN, vedo <debug>
aggiunto ai nomi di alcuni assembly che vengono compilati - come distingue NGEN tra gli assembly debug e non-debug? L'operazione in prova utilizza la generazione di codice dinamico: quale livello di ottimizzazione viene applicato al codice dinamico?
Nota: sto utilizzando il framework a 32 bit a causa di dipendenze esterne. Devo aspettarmi risultati diversi su x64?
Nota: anche io non uso la compilazione condizionale. Quindi la fonte compilata è la stessa per entrambe le configurazioni.
Poiché gli assembly Release NGENed sono ancora più lenti di Debug, sei sicuro che JIT sia il problema? Puoi provare un profiler ... Inoltre, controlla di non utilizzare #if DEBUG nel tuo codice. – Guillaume
Stai usando XmlSerializer senza SGEN? http://stackoverflow.com/questions/771727/net-release-build-working-slower-than-debug – Guillaume
Non sto usando '#if DEBUG' (la domanda è stata modificata per riflettere questo). L'applicazione non è necessariamente più lenta in Release - potrebbe anche essere più veloce, ma sto misurando il tempo di avvio a freddo, non il throughput. Sospetto il JITting dei metodi dinamici e quindi chiedo che cosa decide il livello di ottimizzazione di quelli. – cynic