È necessario effettuare il wrap delle chiamate su Debugger.Log()
nella direttiva #if (DEBUG)
per il preprocessore ai fini dell'ottimizzazione del codice, oppure il compilatore C# produrrà ancora codice ottimizzato durante la creazione della configurazione RELEASE
?Devo eseguire il wrap delle chiamate su Debugger.Log() in #if (DEBUG)?
risposta
Non c'è alcun tipo di ottimizzazione on questo chiamata STAMPA modalità.
La chiamata è presente in IL
. L'unica differenza è che non ha alcun effetto se non è presente un DEBUGGER DEBUGGER.
Da documentazione Debugger.Log:
Se non c'è debugger, questo metodo non ha alcun effetto.
Vorrei suggerire di misurare le prestazioni della tua app e dopo scegliere i passaggi da seguire.
Se non ci sono differenze significative (dal punto di vista della vostra app), lascerei quel registro così com'è.
In questo modo, nel momento del bisogno, è possibile collegare al vostro app con debugger e ottenere messaggi potrebbe essere necessario dal registro, come Debugger.Log
avrebbe funzionato in quel punto.
un test rapido del seguente codice (.NET 4, di uscita, qualsiasi CPU)
class Program
{
static void Main(string[] args)
{
#if (DEBUG)
Debugger.Log(0, "category", "msg");
#endif
}
}
produce questo IL
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 8
L_0000: ret
}
Come potete vedere c'è nessuna chiamata al Debugger.Log
.
Questa è la dichiarazione per Debugger.Log(), come richiamato dalla sorgente di riferimento:
// Posts a message for the attached debugger. If there is no
// debugger attached, has no effect. The debugger may or may not
// report the message depending on its settings.
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern void Log(int level, String category, String message);
Nota che non c'è [condizionale] attributo sul metodo e che porta l'attributo [MethodImplAtttribute]. Ciò significa che il metodo è effettivamente implementato nel CLR, scritto in codice C++.
Quindi il metodo chiama sarà, indipendentemente dalla configurazione. È possibile trovare l'implementazione del metodo dalla distribuzione di origine SSCLI20, clr/src/vm/debugdebugger.cpp. Usa OutputDebugString(), una funzione winapi che mostra le stringhe nel debugger, se ne è collegato uno. O in un'utilità come DbgView.exe di SysInternals. Se nessuno dei due è presente, la chiamata api non fa nulla e ritorna rapidamente. Si paga solo per la funzione chiamata overhead, una manciata di nanosecondi.
Non c'è nulla di decente da ottimizzare sulla chiamata al metodo, essa si comporterà allo stesso modo sia che si costruisca il debug o la configurazione di rilascio. Avere accesso alle informazioni di debug nella versione Release potrebbe essere sicuramente utile, sta a te decidere se questa è una funzionalità che desideri disattivare. È difficile dire se quei nanosecondi abbiano un effetto osservabile sul tuo programma. Misura, non dare per scontato nulla.
- 1. #if Non eseguire il debug in C#?
- 2. Debug delle chiamate OutputDebugString in Delphi
- 3. Come eseguire il debug delle API fluenti?
- 4. Come eseguire il debug delle applicazioni wxpython?
- 5. Come eseguire il debug delle stored procedure in Sybase ASE?
- 6. #if debug -> #if myOwnConfig?
- 7. #ifdef DEBUG versus #if DEBUG
- 8. #if DEBUG vs. condizionale ("DEBUG")
- 9. Come eseguire il debug in modo efficiente delle applicazioni Webpack?
- 10. Come eseguire il debug delle doppie eliminazioni in C++?
- 11. Come eseguire il debug dell'applet cinnamon?
- 12. Come eseguire il debug su Opera Mini?
- 13. Devo invocare chiamate MessageBox?
- 14. Come eseguire il debug di javascript quando va in loop infiniti e chiamate ricorsive in Javascript?
- 15. Come eseguire il debug in fase di debug delle librerie condivise?
- 16. Cosa devo aggiungere al manifest per eseguire il debug di un'applicazione Android su un dispositivo reale?
- 17. Quando #if DEBUG gira
- 18. Defines.Debug vs #if DEBUG
- 19. Come posso eseguire il debug delle regole mod_rewrite?
- 20. Come eseguire il debug delle app in modalità di compatibilità su iOS 7?
- 21. Come eseguire il debug dei test delle unità Django?
- 22. Come eseguire il debug di un deadlock?
- 23. Come eseguire il debug delle sovrapposizioni di mappe vim?
- 24. Come eseguire il debug delle estensioni di Visual Studio
- 25. Come eseguire il debug del caricamento delle risorse JVM?
- 26. grunt-karma eseguire il debug delle fonti non ancora identificate
- 27. Come eseguire il debug delle build di Ember CLI/Broccoli
- 28. Come eseguire il debug delle azioni del selenio WebDriver?
- 29. Come eseguire il debug del debug?
- 30. Node.js: come eseguire il debug in remoto?