2009-06-02 16 views
15

Continuo mi trabajo en mi compilador de C# para mi clase de compiladores. Por el momento, casi he terminado con los capítulos sobre Optimizaciones del compilador en mi libro de texto.¿Qué tipo de optimizaciones hacen tanto el compilador de C# como el JIT?

En general, mi libro de texto no tenía en mente la compilación Just-In-Time cuando estaba escrito y tengo curiosidad acerca de los tipos de optimizaciones estáticas previas al compilador de C# frente a lo que hace durante el proceso JIT?

Cuando hablo con la gente acerca de la compilación contra el CLR, normalmente escucho cosas como, "La mayoría de las optimizaciones son hechas por el JIT".

¿Hay cosas como desenrollado de bucle, plegado/propagación constantes, entrelazado de instrucciones hecho pre-Jit por el compilador de C# o manejado por el jitter? Si no son manejados por el jitter, ¿qué tipo de optimizaciones hace el jitter que son exclusivas de un compilador just-in-time?

+11

La mayor parte de las optimizaciones que menciona son hechas por el jitter. El compilador de C# dobla constantemente porque eso es requerido por la semántica del lenguaje. El compilador de C# ejecutado con/o simplemente realiza optimizaciones simples de flujo de control de IL, como la eliminación de "rama a instrucción siguiente". Este es un buen tema; Veré si puedo criticar un artículo de blog sobre qué optimizaciones hacemos en el nivel de IL. Mira mi blog en el próximo mes más o menos para obtener más detalles. - –

+0

@Eric Lippert, ¡Bonito! ¡No esperaba una respuesta de un desarrollador senior en el equipo compilador de Microsoft! Si lo recuerda, cuando haga su publicación en el blog, asegúrese de hacer un enlace desde aquí. Estaré vigilando de todos modos. Gracias Eric. – mmcdole

+3

De nada. El artículo se publicará el 11 de junio. –

Respuesta

4

Me imagino que hay una serie de optimizaciones que son exclusivas de JIT; específicamente, cualquier optimización que dependa del entorno/contexto en el que se ejecuta la aplicación. (Nota: todo lo siguiente es hipotético, no estoy seguro, que o si alguno de estos se realiza en realidad)

Más aburrido: el JIT puede optimizar dependiendo del sistema operativo subyacente de 32 bits/64 bits, o incluso potencialmente dependiendo de la arquitectura exacta del procesador.

No aplicable:Más interesante: el JIT podría optimizar cualquier cosa que sólo se ejecuta en modo de depuración (determinado código condicional por ejemplo) cuando la aplicación no se ejecuta dentro de un contexto de depuración.

Lo más interesante: el JIT podría optimizar ramas condicionales en una clase que dependa solo de un campo readonly, porque al menos teóricamente ese valor nunca cambiará durante la ejecución de la clase.

Básicamente, me imagino que posponiendo las optimizaciones hasta JIT generalmente sería el camino a seguir, porque en JIT hay la mayor cantidad de información disponible sobre el contexto en el que se está ejecutando el código, haciendo posibles optimizaciones más significativas.

+8

El código de depuración es eliminado por el compilador C# , no por el jitter. –

+0

Estoy corregido – jerryjvl

-5

No creo que el compilador de C# realice ninguna optimización. El JIT hace todo el trabajo.

+0

Como las compilaciones de depuración y liberación son diferentes en el nivel de IL, el compilador realiza algunas optimizaciones. –

+0

Creo que este razonamiento es defectuoso (p.en 'debug' el compilador puede insertar no-ops, otra información de depuración del punto de secuencia, etc.), pero esto no implica que 'release' haga ninguna optimización. – Brian

+1

La compilación de depuración probablemente realiza algunas pesimizaciones que mejoran la depuración, aunque – peterchen

0

David Notario tiene algunas publicaciones en su blog (puede start here, y luego recorrer la historia), pero son bastante esquemáticas.

Cuestiones relacionadas