2010-08-02 17 views
16

De acuerdo con la información que pude reunir el entorno de ejecución de Java y .NET, el estado actual de las cosas es el siguiente:.NET runtime vs. Java Hotspot: ¿Está .NET una generación atrás?

puntos de referencia a un lado y con la intención de escalar la guerra santa, ¿significa esto que Java HotSpot VM es una generación por delante de .Net. ¿Acaso estas tecnologías empleadas en Java VM finalmente llegarán al tiempo de ejecución de .NET?

+11

El artículo vinculado sugiere que la recompilación dinámica podría ser algo bueno, pero que es difícil saber con certeza, ya que la VM puede optar por volver a optimizar sin previo aviso. Sin un perfil de código razonable, parece un artículo de fe, ya que no hay pruebas de que realmente se produzcan "grandes mejoras de rendimiento". –

+0

Parece ser una técnica eficiente para mejorar la sobrecarga de envío polimórfico. Ver también: http://en.wikipedia.org/wiki/Adaptive_optimization y http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.49.3894&rep=rep1&type=pdf – Dan

+4

Si esa tecnología era Tal mejora sobre el modelo JIT/NJEN estoy seguro de que Microsoft lo hubiera implementado. Esa disertación es de 1994 y el artículo de IBM es de 2004. –

Respuesta

8

Nunca comparé los dos para comparar, y estoy más familiarizado con Sun JVM, solo puedo hablar en términos generales sobre los JIT.

Siempre hay compensaciones con optimizaciones, y no todas las optimizaciones funcionan todo el tiempo. Sin embargo, aquí hay algunas técnicas JIT modernas.Creo que esto puede ser el comienzo de una buena conversación si nos ceñimos a la parte técnica:

También hay características que son útiles en la medida de tan buena implementaciones de una VM ir:

  • ser capaz de recoger entre GC
  • implementaciones personalización de cada GC
  • parámetros asignación del montón (tales como el crecimiento)
  • página de bloqueo

Basado en estas características y muchos más, podemos comparar máquinas virtuales, y no solo "Java" versus ".NET", sino, por ejemplo, JVM de Sun versus JVM de IBM versus .NET versus Mono.

Por ejemplo, la JVM de Sun no hace la optimización de la llamada de cola, IIRC, pero la de IBM sí.

8

Al parecer, alguien estaba trabajando en algo similar para Rotor. No tengo acceso a IEEE, así que no puedo leer el resumen.

Dynamic recompilation and profile-guided optimisations for a .NET JIT compiler

Presupuesto de Resumen ...

Una evaluación del marco utilizando un conjunto de programas de prueba muestra que puede mejorar el rendimiento por un máximo del 42,3% y por 9% en promedio. Nuestros resultados también muestran que los gastos generales de recogida de perfil exacto información a través de la instrumentación de un grado mayor que los beneficios de optimizaciones guiada por perfiles en nuestra aplicación, lo que sugiere la necesidad para la aplicación de técnicas que pueden reducir tales gastos generales .

+1

Punto de interés. Me pregunto si esta es la razón por la cual el conmutador -servidor parece hacer una gran diferencia en Java, quizás suponen que si no tiene el -server switch que recompilar agresivamente no será una buena solución de compromiso, sino con -server supondría que podría estar ejecutando durante meses por lo que podría seguir adelante y hacerlo funcionar lo mejor posible ... –

14

Siguen dos estrategias diferentes. No creo que uno sea mejor que el otro.

  • .NET no interpretar el código de bytes, por lo que tiene que JIT todo como está será ejecutado y por lo tanto no se puede optimizar en gran medida por falta de tiempo. Si necesita optimizaciones pesadas en alguna parte del código, siempre puede NGENERLO manualmente o realizar una implementación rápida pero unsafe. Además, calling native code is easy. El enfoque aquí parece ser conseguir el tiempo de ejecución lo suficientemente bueno y optimizar manualmente los cuellos de botella.

  • Las JVM modernas generalmente interpretarán la mayor parte del código, y luego realizarán una compilación optimizada de los cuellos de botella. Esto generalmente obtiene mejores resultados que el JIT directo, pero si necesita más, no tiene unsafe en Java y calling native code is not nice. Por lo tanto, el enfoque aquí es hacer la mayor optimización automática posible, porque las otras opciones no son tan buenas.

En realidad, las aplicaciones de Java tienden a funcionar ligeramente mejor en el tiempo y peores en el espacio en comparación con .NET.

+0

La mejor respuesta. Aunque no soy un experto en Java, creo que el equivalente de PInvoke es mucho más simple que JNA (http://en.wikipedia.org/wiki/Java_Native_Access) y no JNI. – ygoe

3

Puede estar interesado en SPUR que es un compilador de JIT de seguimiento. El foco está en javascript, pero opera en CIL, no en el idioma en sí. Es un proyecto de investigación basado en Bartok, no en la máquina virtual .NET estándar. El documento tiene algunos puntos de referencia de rendimiento que muestran 'consistentemente realiza más rápido que SPUR-CLR' que es el estándar 3.5 CLR. Sin embargo, no ha habido ningún anuncio sobre su futuro en relación con la VM actual. Las trazas pueden cruzar los límites del método, lo que no es algo que HotSpot hace AFAIK, los JIT de rastreo de JVM se mencionan here.

No me atrevo a decir que .NET VM tiene una generación de retraso, especialmente cuando se consideran todos los subsistemas, en particular los genéricos. Cómo comparar GC y DLR vs invookedynamic No estoy seguro, pero hay muchos detalles sobre ellos en lugares como channel9.