¿Es necesario ajustar las llamadas a Debugger.Log()
en la directiva de preprocesador #if (DEBUG)
con el fin de optimizar el código, o el compilador de C# aún producirá el código optimizado al construir la configuración RELEASE
?¿Debo incluir las llamadas a Debugger.Log() en #if (DEBUG)?
Respuesta
no hay ninguna tipo de optimización en este llamada en LIBERACIÓN modo.
La llamada está presente en IL
. La única diferencia es que no tiene ningún efecto si no hay un DEBUGGER presente.
De la documentación Debugger.Log:
Si no hay un depurador asociado, este método no tiene ningún efecto.
Le sugiero que mida el rendimiento de su aplicación y luego elija los pasos a seguir.
Si no hay una diferencia significativa (desde el punto de vista de su aplicación), dejaría ese registro como está.
De esta manera, en el momento de necesidad, se puede adjuntar a su aplicación con depurador y obtener los mensajes que pueda necesitar desde el registro, como Debugger.Log
funcionaría en que punto.
Una prueba rápida de la siguiente código (.NET 4, Release, Cualquier CPU)
class Program
{
static void Main(string[] args)
{
#if (DEBUG)
Debugger.Log(0, "category", "msg");
#endif
}
}
produce esta IL
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 8
L_0000: ret
}
Como se puede ver no hay una llamada a la Debugger.Log
.
Esta es la declaración de Debugger.Log(), como se recupera de la Fuente de referencia:
// 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);
Tenga en cuenta que no hay [condicional] atributo en el método y que lleva el atributo [MethodImplAtttribute]. Lo que significa que el método se implementa realmente en el CLR, escrito en código C++.
Por lo tanto, la llamada al método se realizará independientemente de la configuración. Puede encontrar la implementación del método a partir de la distribución fuente SSCLI20, clr/src/vm/debugdebugger.cpp. Utiliza OutputDebugString(), una función de winapi que muestra cadenas en el depurador, si hay una adjunta. O en una utilidad como DbgView.exe de SysInternals. Si ninguno de los dos está presente, la llamada de API simplemente no hace nada y vuelve rápidamente. Usted solo paga por la sobrecarga de llamada de función, un puñado de nanosegundos.
No hay nada decente para optimizar acerca de la llamada al método, se realizará de la misma manera ya sea que construya la configuración de depuración o liberación. Tener acceso a la información de depuración en la compilación de Release podría ser útil, depende de usted decidir si esa es una función que desea desactivar. Si esos nanosegundos tienen un efecto observable en su programa es difícil de decir. Mida, no asuma nada.
- 1. Encerrar llamadas a debug() en if isDebugEnabled(): ¿una buena política?
- 2. Defines.Debug vs DEBUG #if
- 3. condicional ("Test") + #if DEBUG
- 4. Delphi #IF (DEBUG) equivalente?
- 5. #if DEBUG vs condicional ("Test")
- 6. ¿Cómo usar django-debug-toolbar en llamadas AJAX?
- 7. ¿Está 'desaprobado #IF DEBUG' en la programación moderna?
- 8. Cómo incluir Web Debug Toolbar en Symfony Response?
- 9. ¿DEBO RESTABLECER mis llamadas RPC a través de HTTP?
- 10. condicional incluir en linq a las entidades?
- 11. ¿Debo incluir siempre un InputStream como BufferedInputStream?
- 12. ¿Qué debo #incluir para usar 'htonl'?
- 13. ¿Cómo debo pasar objetos a las subrutinas?
- 14. ¿Qué efecto tiene el punto-slash en PHP incluir llamadas?
- 15. ¿Cómo encuentro las llamadas a los métodos?
- 16. ¿Las llamadas sucesivas a recvfrom() pierden datos?
- 17. Puede agregar prioridades a las llamadas AJAX
- 18. Evite las llamadas repetidas a la Interpolación
- 19. #if No depurar en C#?
- 20. ¿Cómo burlarse de las llamadas a funciones encadenadas en python?
- 21. ¿Es if (document.getElementById ('algo')! = Nulo) idéntico a if (document.getElementById ('algo'))?
- 22. ¿Debo incluir getters & setters en el diagrama de clases?
- 23. ¿Debo incluir el complemento "sin prefijo" en mi sitio web
- 24. ¿Cómo debo cadena de llamadas en función de CoffeeScript
- 25. ¿Qué debo incluir en mi archivo de cabecera para ostream
- 26. ¿Se deben evitar las llamadas consecutivas a `errno`?
- 27. ¿Cómo ignorar las llamadas a métodos inesperados en JUnit/easymock?
- 28. ¿cómo funcionan las llamadas a procedimiento en el ensamblador?
- 29. ¿Qué tan caras son las llamadas a funciones en JavaScript?
- 30. Cómo gestiona CLR las llamadas a métodos externos en C#