2010-08-06 18 views
12

Quanto guadagno di prestazioni (se presente) può un guadagno del servizio Windows tra una build di debug e una build di rilascio e perché?C# Debug vs Release

+0

Questa è una grande domanda che potrebbe essere ben servita da alcuni parametri di riferimento, se qualcuno può fornirli. – kbrimington

+0

possibile duplicato di [C# debug rispetto alle prestazioni di rilascio] (http://stackoverflow.com/questions/2446027/c-debug-vs-release-performance) –

risposta

6

Per il codice gestito, a meno che non ci siano molte cose compilate in modo condizionale per i build di DEBUG, ci dovrebbe essere poca differenza - l'IL dovrebbe essere praticamente lo stesso. Il jitter genera in modo diverso quando viene eseguito con il debugger o meno - la compilazione su IL non è influenzata molto.

Ci sono alcune cose che lo /optimize compie quando si compila in IL, ma non sono particolarmente aggressive. E alcune di quelle ottimizzazioni dell'IL verranno probabilmente gestite dall'ottimizzazione del jitter, anche se non sono ottimizzate nell'IL (come la rimozione dei nops).

l'articolo di Eric Lippert See http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx per i dettagli:

La bandiera/optimize non cambia di una quantità enorme di nostra emittente e logica di generazione. Cerchiamo di generare sempre un codice semplice e verificabile e quindi fare affidamento sul jitter per effettuare il pesante sollevamento delle ottimizzazioni quando genera il codice macchina reale. Ma faremo alcune semplici ottimizzazioni con quel flag set.

Leggi l'articolo di Eric per informazioni su /optimize fa diversamente nella generazione di IL.

+0

Roba buona ... e la sicurezza? Se spedisci/esporti con informazioni di debug, un'ispezione rivelerà di più sul tuo codice? Anche se c'è una differenza trascurabile nelle prestazioni, non spedirò il codice di debug a meno che non sia necessario. –

+1

@Edward: Non sto veramente sostenendo la distribuzione di build DEBUG, solo dicendo che probabilmente non dovresti aspettarti una differenza sostanziale nelle prestazioni tra build DEBUG e RELEASE.Inoltre, non penso che una build DEBUG abbia ulteriori dettagli nell'assembly stesso: le informazioni di debug vanno nel file .pdb, che non è necessario distribuire. Gli assembly .NET sono generalmente facilmente smontabili/decompilati (vedere lo strumento Reflector). Se sei preoccupato del reverse engineering, ci sono strumenti di offuscamento per aiutarti, ma non ne so davvero nulla. –

+1

Grazie ... Ho dimenticato il .pdb con le informazioni di debug. Molti strumenti di offuscamento non sono completamente a prova e potenzialmente costosi. Presumo sempre che se qualcuno vuole davvero entrare, entrerà. Dovrei passare più tempo a innovare e meno tempo a proteggere. –

1

Bene, anche se la domanda è un duplicato, sento che alcune delle risposte migliori nella domanda originale sono in fondo. Personalmente ho visto situazioni in cui c'è una differenza apprezzabile tra le modalità di debug e di rilascio. (Esempio: Property performance, dove c'era una differenza di 2 volte tra l'accesso alle proprietà in modalità debug e release). Se questa differenza sia presente in un software reale (invece che come un programma di riferimento) è discutibile, ma l'ho visto accadere in un prodotto su cui ho lavorato.

Dalla risposta di Neil sulla domanda iniziale, da msdn social:

Non è ben documentato, qui è quello che so. Il compilatore emette un'istanza di System.Diagnostics.DebuggableAttribute. Nella versione di debug, la proprietà IsJitOptimizerEnabled è True, nella versione di rilascio è False. È possibile visualizzare questo attributo nel manifest di assembly con ildasm.exe.

Il compilatore JIT utilizza questo attributo per disabilitare le ottimizzazioni che renderebbero difficile il debug. Quelli che spostano il codice come un sollevamento invariante il ciclo. In casi selezionati, questo può fare una grande differenza nelle prestazioni. Non di solito però.

Il mapping dei punti di interruzione agli indirizzi di esecuzione è il lavoro del debugger. Usa il file .pdb e le informazioni generate dal compilatore JIT che fornisce l'istruzione IL per la mappatura dell'indirizzo del codice. Se dovessi scrivere il tuo debugger, dovresti usare ICorDebugCode :: GetILToNativeMapping().

Problemi correlati