2010-03-08 16 views
44

Cuando leo sobre el rendimiento de lenguajes JIT como C# o Java, los autores suelen decir que deberían/​​podrían teóricamente superar el rendimiento de muchas aplicaciones compiladas nativamente. 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.¿Optimiza realmente .NET CLR para el procesador actual

¿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?

+0

Por lo que sé, en este momento, no realmente. – zneak

+1

Un teórico de la conspiración también podría reflexionar sobre si MS podría codificar el JIT para des-optimizar si el software se ejecuta bajo el sistema de un competidor, como ser virtualizado en una Mac x86, suponiendo que pudieran detectar que era una Mac. – AaronLS

+8

@aaronls: MacBU hace un estimado de 350 millones de dólares al año en ingresos para Microsoft. Los Mac son un * centro de beneficios * para Microsoft, que es el mayor proveedor de software para Mac en el mundo fuera de Apple. ¿Cómo encajan estos hechos en su teoría de la conspiración? –

Respuesta

27

Desde el año 2005, David Notario enumera varias optimizaciones específicas dirigidas a su entrada de blog "Does the JIT take advantage of my CPU?". No puedo encontrar nada sobre el nuevo CLR 4, pero imagino que se incluyen varios artículos nuevos.

+4

Wow. Este es un buen hallazgo. +1 –

+0

Buen enlace, gracias. +1 – dewald

+0

Cita del blog: "no vectorizamos el código (que es la ganancia real con SSE2)". Por desgracia, JIT no tiene muchas ventajas. – colinfang

8

Optimización específica de un procesador Soy consciente de que esto se hace en Mono compilando Mono.Simd calls hasta instrucciones SSE en procesadores que admiten SSE. Si el procesador que ejecuta el código no es compatible con SSE, el compilador JIT generará el código equivalente no SSE.

1

Creo que algunos compiladores de Java sí, 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).

+0

¿Tiene alguna referencia para respaldar su afirmación de que MS .NET no lo hace? Sin cuestionarlo, solo preguntándome si es opinión o hecho documentado. –

+2

Bueno, resulta que Microsoft .NET realiza algunas optimizaciones basadas en el conjunto de instrucciones pero no en características particulares de la CPU, como el diseño de la memoria caché (http://blogs.msdn.com/davidnotario/archive/2005/08/15/451845. aspx).Mi punto acerca de que el código precompilado puede usar las mismas optimizaciones (y más que son demasiado costosas de encontrar en un compilador JIT) aún se mantiene. –

0

Conozco las reglas para cambiar o no las funciones en línea dependiendo del 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.

+0

Sí, pero el tamaño del puntero _siempre_ cambia, no importa si está utilizando un compilador tradicional o no. – zneak

2

Los Jitters de 32 y 64 bits son diferentes, eso es un comienzo.

+0

Según entiendo la pregunta, el OP está buscando optimizaciones * específicas del procesador dentro de una familia de procesadores * (por ejemplo, ¿genera código específico dependiendo de que el procesador actual esté basado en la microarquitectura NetBurst vs. Core, ambos en modo de 32 bits?) –

+0

@Mehrdad, sé que esta no era la dirección principal, pero pensé que merecía una mención. –

2

.Net Framework Runtime Optimization Service optimiza no solo problemas de programación (optimización del compilador) sino también para procesadores.

2

Señalaré que la razón principal que escuché citada sobre el potencial de los lenguajes compilados JIT para superar a 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, inline caching se puede usar para hacer llamadas a métodos virtuales más o menos tan rápido como 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).

+0

¿El CLR de Microsoft realiza el almacenamiento en caché en línea? – dewald

+0

@dewald - No es que yo sepa, pero creo que varias máquinas virtuales Java sí. Dado que los métodos no son virtuales por defecto en C# (a diferencia de Java), creo que esta era una prioridad menor para .NET. Sin embargo, este es solo un ejemplo de cómo un JIT puede realizar optimizaciones en tiempo de ejecución que son duras o imposibles de realizar de forma estática. – kvb

+2

@dewald - Consulte http://stackoverflow.com/questions/1255803/does-the-net-clr-jit-compile-every-method-every-time para obtener más información sobre el contraste entre los enfoques CLR y JVM. – kvb

Cuestiones relacionadas