¿Qué tipo de optimizaciones hacen tanto el compilador de C#como el JIT?
optimization compiler-construction (3)
David Notario tiene algunas publicaciones en su blog (puede comenzar aquí , y luego recorrer la historia), pero son bastante incompletas.
Continúo 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.
En su mayor parte, mi libro de texto no tenía en mente la compilación de 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 de JIT ?
Cuando hablo con la gente acerca de cómo compilar contra el CLR, generalmente escucho cosas como "La mayoría de las optimizaciones las realiza el JIT".
¿Hay cosas como bucle que se desenrolla, 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?
No creo que el compilador C # haga ninguna optimización. El JIT hace todo el trabajo.
Puedo imaginar 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, todos los siguientes son hipotéticos, 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 solo se ejecute en modo Debug (por ejemplo, cierto código condicional) 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 de solo readonly
, porque al menos teóricamente ese valor nunca cambiará durante la ejecución de la clase.
Básicamente, me imagino que postergar 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, lo que hace posible optimizaciones más significativas.