2009-06-09 16 views
8

¿Hay una lista completa de optimizaciones hechas por el /optimize C# compiler key disponible en cualquier lugar?¿Para qué sirve/optimiza la clave del compilador de C#?

EDITAR: ¿Por qué está deshabilitado de manera predeterminada? ¿Vale la pena usarlo en una aplicación real? - está deshabilitado de forma predeterminada solo en la configuración de depuración y habilitada en la versión.

+2

Estaré respondiendo a esta pregunta (¡con frecuencia!) En mi blog el 11 de junio. –

+2

http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –

Respuesta

7

Scott Hanselman has a blog post que muestra algunos ejemplos de lo que/optimizar (que está habilitado en Release Builds) hace.

Como resumen:/optimize hace muchas cosas sin dar ningún número exacto o definición, pero una de las más visibles es el método en línea (si tiene un Método A() que llama B() que llama C() que llamadas D(), el compilador puede "omitir" B y C y pasar de A a D directamente), lo que puede causar una pila de llamadas "extraña" en la versión Release.

+0

Agradable, gracias :-) –

2

Está deshabilitado de forma predeterminada para compilaciones de depuración. Para versiones de Release está habilitado.

Definitivamente vale la pena habilitar este modificador ya que el compilador realiza muchos ajustes y optimizaciones dependiendo del tipo de código que tenga. Por ejemplo: omisión de inicializaciones redundantes, comparaciones que nunca cambian, etc.

Nota: Es posible que tenga alguna dificultad para depurar si su optimización de encendido como el código que tiene y el código IL que se genera pueden no coincidir. Esta es la razón por la que está activada solo para compilaciones de versión.

+0

Oh, de hecho. Actualizaré la pregunta. Pero todavía me pregunto cuál es la lista exacta (o lo suficientemente completa) de optimizaciones ... –

2

citado del MSDN page:

La opción/Optimizar habilita o deshabilita optimizaciones realizadas por el compilador para hacer su archivo de salida más pequeño, más rápido y más eficiente.

En otras palabras, hace exactamente lo que crees que haría: optimiza el código compilado CIL (Common Intermediate Language) que se ejecuta en .NET VM. No me preocuparía cuáles son las optimizaciones específicas; baste decir que son muchas, y probablemente bastante complejas en algunos casos. Si está realmente interesado en qué tipo de cosas hace, probablemente podría investigar el Mono C# Compiler (dudo que los detalles sobre el MS C# sean públicos).

La optimización de la razón está deshabilitada de forma predeterminada para La configuración de la depuración es que hace que ciertas funciones de depuración sean imposibles. Algunas de las más notables:

  • Tal vez lo más importante, la Editar y continuar función está desactivada - es decir, no hay código de modificación durante la ejecución.
  • La ejecución de ejecución a menudo significa que se resalta la línea de código incorrecta (por lo general, la que está después de la esperada).
  • Las variables locales no utilizadas en realidad no están asignadas o incluso declaradas.

Realmente, las opciones predeterminadas para la optimización nunca deberían cambiarse. Tener la opción desactivada para la depuración es muy útil, mientras que tenerlo activado para el modo de lanzamiento es igualmente acertado.

+0

No me preocupo por las optimizaciones, solo me gustaría saber qué son :-) Me gustaría votar por su esfuerzo también, pero una cosa me impide hacer eso: ".NET VM" :-) –

+0

+ 1 voto. Aunque el término dista mucho de ser preciso, llamar al CLR VM no es, desde un punto de vista conceptual, totalmente erróneo. Tiene un código de máquina pseudo, CIL, que se ejecuta en una máquina que no existe, pero que es emulada por el CLR. Se puede argumentar que el hecho de que CLR JITs el código es un detalle de implementación, a pesar de que uno lleva enormes consecuencias (en su mayoría beneficiosas). –

+0

@Rui: Gracias ... Y sí, entendí que técnicamente es el CLR, pero tiendo a usar los términos indistintamente por el bien de muchos argumentos. Sin embargo, tu explicación aclara las cosas. También vale la pena señalar que el equivalente de Java del CLR se denomina explícitamente VM (la JVM), y creo que incluso MS se refiere a ello como una máquina virtual a veces, por lo que el término se utiliza con bastante frecuencia en este contexto. – Noldorin

Cuestiones relacionadas