2009-07-10 14 views
37

¿Alguna vez ha tenido que justificar la elección antes que utilizar .NET en lugar de Java en función del rendimiento?Rendimiento de rendimiento comparativo en Java VM frente a .NET CLR

Para un sistema de procesamiento de transacciones de alto volumen típico que puede realizar las siguientes operaciones,

  • transacciones base de datos simultáneas
  • cálculos matemáticos
  • Interacción con otros servicios web (SOAP/XML, XML-RPC)

Mi enfoque sería codificar pruebas de referencia tanto en Java para la JVM como en C# para .NET CLR que comparan las operaciones anteriores bajo var niveles de carga y compara los resultados.

Preferencias de idioma y plataforma aparte, Estoy interesado en saber cómo realizar una comparación de rendimiento concluyente entre Java VM y .NET CLR?

¿Existe algún punto de referencia integral y respetado que exista?

+0

Solo para reiterar, me gustaría saber cuál sería su enfoque al hacer una comparación de rendimiento concluyente entre las dos plataformas, es decir, la complejidad/legibilidad del código, el soporte de la biblioteca, etc. no son problemas. El rendimiento es el único criterio usted tiene que evaluar –

Respuesta

35

No tengo números exactos sobre la eficiencia de la JVM frente a la CLR, pero es probable que la diferencia sea pequeña.

Sin embargo, en el lado del lenguaje, C# tiene algunas construcciones de bajo nivel más que Java, lo que permitiría una mayor optimización.

construcciones tales como: tipos de valor definidas

  • de usuario. Rápido de asignar, sin sobrecarga de memoria (que es de 12 bytes por tipo de referencia tanto en CLR como en JVM si no recuerdo mal). Útil para las cosas que se dejan expresar naturalmente como valores, como vectores y matrices. Entonces operaciones matemáticas Combine esto con ref y out para evitar la copia excesiva de estos tipos de valores grandes.

  • Bloques inseguros de código que permiten un poco más de optimización 'cerca del metal'. Por ejemplo, aunque CLR y JVM pueden evitar las comprobaciones de límites de la matriz en algunas situaciones, en muchos casos no pueden hacerlo y cada acceso a la matriz requiere una comprobación de si el índice está todavía dentro de los límites de la matriz. El uso de un código inseguro aquí le permite acceder a la memoria de la matriz directamente con punteros y eludir las verificaciones de límites. Esto puede significar un ahorro significativo. Y en el lado de muy bajo nivel, también hay stackalloc que le permite asignar matrices directamente en la pila, mientras que una matriz normal se asigna en el montón, que es más lento, pero también más conveniente. Personalmente no conozco ninguna aplicación práctica de stackalloc.

  • Verdaderos genéricos, a diferencia del tipo que borra los genéricos de Java, evitando el casting y el boxeo innecesarios. Pero si esto es un problema en el programa Java, puede ser fácilmente resuelto con un poco de trabajo extra (el cambio de, por ejemplo, un ArrayList<Integer> a un tipo personalizado que internamente utiliza un búfer int[].)

todo esto parece sesgado hacia C# y creo que C# tiene mejores construcciones de lenguaje de bajo nivel disponibles que pueden ayudar con el rendimiento. Sin embargo, dudo que estas diferencias realmente importen (y es posible que ni siquiera se apliquen en su caso, el uso de punteros no le gana nada si todo lo que hace es acceso a la base de datos, donde Java puede ser más rápido) si la elección lo impide de alguna otra manera (como ir plataforma cruzada). Vaya por correcto, la plataforma que coincida con sus requisitos, en lugar de diferencias de rendimiento menores.

+2

@JulianR: Gracias por la vista objetiva. Estoy de acuerdo, C# tiene mejores construcciones de bajo nivel (entre otras mejoras), pero eso es probablemente porque tuvo la oportunidad de aprender de los caprichos de Java (¿errores?). –

+3

"es probable que la diferencia sea pequeña". Woah, las diferencias pueden ser enormes. Por ejemplo, las tablas hash genéricas pueden ser 17 veces más rápidas en .NET que en JVM. http://fsharpnews.blogspot.co.uk/2010/05/java-vs-f.html –

+2

"Creo que es objetivamente superior". Estoy de acuerdo en que C# es generalmente superior, pero un lugar donde Java tiene una gran ventaja es la recolección de basura. Con tipos de valores y genéricos reificados, .NET le permite evadir GC por completo con más frecuencia, pero cuando eso no es posible, la JVM tiende a tener la ventaja de una implementación de GC significativamente más optimizada. De hecho, las JVM se utilizan para iniciar nuevos algoritmos de GC ... –

1

Sí, el juego de referencia es bastante completo y te permite comparar muchas cosas diferentes.

http://shootout.alioth.debian.org/

La única cosa es que utiliza mono en lugar de Visual Studio, pero la diferencia de rendimiento entre los dos ahora es muy pequeña.

en general, java suele ser un poco más rápido (dependiendo de lo que esté haciendo) pero utiliza una memoria mucho más grande y ambos tienen aproximadamente el mismo tamaño de fuente.

+0

En términos de complejidad, lo que estamos haciendo es bastante estándar y está bien soportado en ambas plataformas. Sin embargo, queremos determinar si optaremos por la plataforma que nos proporcione el mejor rendimiento y escalabilidad. –

+1

"Lo único es que usa mono en lugar de estudio visual, pero la diferencia de rendimiento entre los dos es ahora muy pequeña". - depende. Por ejemplo, compare el tiempo de la prueba n-body en Mono y .NET. No es pequeño –

+0

"Lo único es que utiliza mono en lugar de estudio visual, pero la diferencia de rendimiento entre los dos es ahora muy pequeña". .NET fue un 50% más rápido que Mono en este punto de referencia numérico. http://flyingfrogblog.blogspot.co.uk/2009/01/mono-22.html –

1

Para su información, no se le permite específicamente usar el código .NET Framework para ninguna forma de evaluación comparativa sin contactar primero a Microsoft y obtener su aprobación.

Si desea publicar algo, creo que le dejaré saber.

De memoria MS hizo algo de librería, tienda de mascotas que Java hizo primero para mostrar cómo su software podría funcionar más efectivamente en la misma tarea. Estoy tratando de pensar en eso.

.NET Pet Store

+0

Gracias es interesante, ¡probablemente por qué estoy luchando para encontrar resultados publicados! –

+6

Ignora el "punto de referencia de la tienda de mascotas". Microsoft tomó un tutorial de Java e hizo una versión .Net optimizada. Adivina qué versión era más fácil de leer y cuál era más rápida. IMO esto demostró que .NET era, de hecho, más lento, o que hubieran escogido una pelea justa. (Nota: fue, no es). – MSalters

+0

Para aquellos interesados ​​en el "punto de referencia de la tienda de mascotas": http://www.theregister.co.uk/2001/11/12/pet_vs_pet_ms_opens/ –

1

puntos de referencia ... Usted puede probar casi todas las cosas con la prueba que se adapte a sus necesidades.
Excepto Chuck Norris. Chuck Norris es más lento y más rápido que X si así lo desea.

Otro punto. Digamos que llega a la conclusión de que Java es más rápido. ¿Eso implicaría que dentro de 2 años todavía será más rápido?

Si Java es un 5% más rápido y .NET es un 10% más fácil de trabajar, ¿con qué elegirías?
Hay muchos factores y el rendimiento es solo uno de ellos. Y si las diferencias son pequeñas (creo que lo son), probablemente no sea la más importante.

A menos que esté creando algo que sea muy crítico para el rendimiento.

+1

Por el bien de esta pregunta, el rendimiento es el criterio que quiero evaluar. Entiendo que hay muchos otros criterios al elegir un idioma/plataforma (complejidad/legibilidad del código, disponibilidad de habilidades, etc.), el objetivo de mi pregunta es determinar cómo otros realizarían una evaluación de desempeño entre las dos plataformas . –

+0

-1 "Puedes probar casi todo con pruebas que se adaptan a tus necesidades". No, no puedes. Creo que quieres decir que puedes tratar de engañar a la gente, pero a la OP le interesa recopilar información útil que es completamente factible. –

1

También me he preguntado cuál daría un mejor rendimiento. Pero no tengo idea de cómo podría realizar la prueba de punto de referencia para esto.

Buena pregunta, con suerte todos obtendremos orientación aquí.

Supongo que esta prueba de referencia necesitaría ser un enfoque de prueba de referencia de "descuento" (fácil de instalar & ejecutado por 1 desarrollador)?

Si alguien tiene este tipo de información sería genial. A menudo me piden que evalúe las tecnologías por mi cuenta en escalas de tiempo cortas.

Nice one bunn_online!

+0

@ForerMedia Gracias por retomar el rumbo de esta discusión. Demasiado a menudo basamos nuestras decisiones en puntos de vista parciales (lealtad del proveedor/plataforma, etc.), sin objetivos. Mi objetivo al plantear esta pregunta fue ver cómo todos los demás harían esto. Qué métodos, herramientas y cobertura usarían, etc. –

3

una comparación de rendimiento concluyente entre la máquina virtual de Java y .Net CLR es una quimera. Siempre puede hacer una prueba de rendimiento que hará que uno se vea mejor que el otro, ya que diseñar un sistema complejo siempre implica compromisos. Si reduce el tipo de puntos de referencia a la velocidad y la memoria del tiempo de ejecución, puede encontrar artículos como este: http://www.codeproject.com/KB/dotnet/RuntimePerformance.aspx que de ninguna manera es el final del debate.

2

Dejando de lado las preferencias de idioma y plataforma, ¿me interesa saber cómo se haría una comparación de rendimiento concluyente entre Java VM y .Net CLR?

Escribo un conjunto de puntos de referencia diseñados para permitirle comparar varias características diferentes de las dos máquinas virtuales y sus bibliotecas estándar. Mi experiencia es en informática técnica, así que recomendaría lo siguiente:

  • En el registro aritmética de enteros, p. Fibonacci.
  • En aritmética de punto flotante de registro, p. mandelbrot.
  • iteración de matriz, p. FFT.
  • Asignación, p. árboles rojo-negros puramente funcionales.
  • Tablas hash con claves y valores int o float.
  • Tablas hash con claves de cadena y valores.
  • Cuerdas.
  • Expresiones regulares.
  • Archivo IO.

Tal vez pueda encontrar algo similar para bases de datos y servicios web.

No olvide que los idiomas que se encuentran en la parte superior de la CLR tienen propiedades bastante diferentes. Por ejemplo, inline en el lenguaje F # le permite automatizar optimizaciones que pueden dar enormes ganancias de rendimiento sobre C#. Por el contrario, goto en C# le permite hacer algunas cosas más eficientemente que en F # y las optimizaciones en las estructuras fueron más efectivas en C# que en F # (la última vez que miré).

¿Existen referencias completas y respetadas que existan?

No, pero hay muchos puntos de referencia dispersos que se centran en los valores atípicos porque son más interesantes. Por ejemplo, this blog post describe por qué un benchmark de tabla hash genérico simple puede ser 17 × más rápido en F # en .NET que en Java en JVM. En ese caso, la razón fue que los tipos de valor y los genéricos reificados permiten escribir una implementación de tabla hash genérica mucho más eficiente en .NET que en la JVM.

Cuestiones relacionadas