c# - ¿.NET CLR realmente optimiza para el procesador actual
optimization jit (7)
Cuando leo sobre el rendimiento de lenguajes JITted como C # o Java, los autores generalmente dicen que deberían / podrían teóricamente superar a muchas aplicaciones nativas compiladas. La teoría es que las aplicaciones nativas generalmente solo se compilan para una familia de procesadores (como x86), por lo que el compilador no puede realizar ciertas optimizaciones, ya que pueden no ser realmente optimizaciones en todos los procesadores. Por otro lado, el CLR puede realizar optimizaciones específicas del procesador durante el proceso JIT.
¿Alguien sabe si el CLR de Microsoft (o Mono) en realidad realiza optimizaciones específicas del procesador durante el proceso de JIT? Si es así, ¿qué tipo de optimizaciones?
.Net Framework Runtime Optimization Service optimiza no solo los problemas de programación (optimización del compilador) sino también los procesadores.
Creo que algunos compiladores de Java sí lo hacen, Microsoft .NET no, y solo supera a los precompilados cuando compara manzanas con naranjas. Precompilado puede enviarse con una biblioteca de variantes sintonizadas en diferentes CPU (o más probablemente, diferentes conjuntos de instrucciones) y la comprobación del tiempo de ejecución para elegir qué biblioteca cargar es mucho más barata que JIT. Por ejemplo, mplayer hace esto (google para mplayer enable-runtime-cpudetection).
Desde 2005, David Notario enumeró varias optimizaciones específicas dirigidas a su entrada en el blog " ¿El JIT aprovecha mi CPU? ". No puedo encontrar nada sobre el nuevo CLR 4, pero imagino que se incluyen varios artículos nuevos.
Los Jitters de 32 y 64 bits son diferentes, eso es un comienzo.
Sé que las reglas para cambiar las funciones en línea varían según el tipo de procesador (x86, x64). Y, por supuesto, el tamaño del puntero variará dependiendo de si se ejecuta como 32 bits o 64 bits.
Señalaré que la razón principal que escuché citada sobre el potencial de los lenguajes compilados JIT para superar los lenguajes compilados estáticamente no tiene nada que ver con las instrucciones específicas del procesador. En cambio, es que la información sobre el estado dinámico del programa se puede utilizar para optimizar las rutas de código. Por ejemplo, el almacenamiento en caché en línea se puede usar para hacer llamadas a métodos virtuales más o menos tan rápido como las llamadas a métodos no virtuales. A grandes rasgos, esto funciona suponiendo que en un sitio de llamada en particular, el método se llama solo en un único tipo y emitiendo un código que salta directamente a esa implementación (y luego reescribe el código si esta suposición no surge más adelante).
Una optimización específica del procesador de la que soy consciente en Mono está compilando llamadas Mono.Simd
a instrucciones de SSE en procesadores que soportan SSE. Si el procesador que ejecuta el código no es compatible con SSE, el compilador JIT generará el código equivalente no SSE.