benchmarksgame benchmark alioth java .net performance jvm benchmarking

java - alioth - c# vs c++ benchmark



Rendimiento de benchmarking en Java VM vs.NET CLR (7)

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

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

Lo único es que utiliza mono en lugar de estudio visual, pero la diferencia de rendimiento entre los dos es ahora muy pequeña.

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

¿Alguna vez ha tenido que justificar la elección antes que usar .NET en lugar de Java en función del rendimiento?

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

  • Operaciones concurrentes de base de datos
  • Cálculos matemáticos
  • Interacción con otros servicios web (SOAP / XML, XML-RPC)

Mi enfoque sería codificar pruebas de referencia en Java para JVM y C # para .NET CLR que comparen las operaciones anteriores bajo varios niveles de carga y comparen los resultados.

Dejando a un lado las preferencias de idioma y plataforma, me interesa saber cómo harías para hacer una comparación de rendimiento concluyente entre Java VM y .NET CLR.

¿Existen puntos de referencia integrales y respetados que existan?


También me he preguntado cuál daría 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 alguna orientación aquí.

Supongo que esta prueba de referencia necesitaría ser un enfoque de prueba de referencia de "descuento" (fácil de instalar y ejecutar 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.

Bonito un bunn_online!


una comparación de rendimiento concluyente entre Java VM 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.


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

Escribiría 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ético entero, por ejemplo, Fibonacci.
  • En aritmética de punto flotante de registro, p. Ej. Mandelbrot.
  • Iteración de matriz, por ejemplo, FFT.
  • Asignación, por ejemplo, árboles rojo-negros puramente funcionales.
  • Tablas hash con claves y valores int o float.
  • Tablas hash con claves de cadena y valores.
  • Instrumentos de cuerda.
  • Expresiones regulares.
  • Archivo IO.

Tal vez puedas 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, en inline en el lenguaje F # le permite automatizar optimizaciones que pueden dar enormes ganancias de rendimiento sobre C #. Por el contrario, goto a C # te permite hacer algunas cosas de manera más eficiente de lo que es posible en F # y las optimizaciones en las estructuras fueron más efectivas en C # que en F # (la última vez que miré).

¿Existen puntos de referencia integrales y respetados?

No, pero hay muchos puntos de referencia dispersos que se centran en los valores atípicos porque son más interesantes. Por ejemplo, esta publicación de blog describe por qué un benchmark de tabla hash genérico simple puede ser 17 veces 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.


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

Si querías publicar algo, pensé que te lo haría saber.

Desde la 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 eficazmente en la misma tarea. Estoy tratando de pensar en eso.

Tienda de mascotas .NET


Puntos de referencia ... Puede probar casi todo con una prueba que satisfaga 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é construyendo algo que sea muy crítico para el rendimiento.


No tengo números exactos sobre la eficiencia de la JVM frente a la CLR, pero la diferencia, si la hay, es 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 valores definidos por el 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 gran valor.

  • Bloques inseguros de código que permiten una optimización un poco más "cercana al 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 su programa Java, puede resolverse fácilmente con un poco de trabajo adicional (cambiando de, por ejemplo, una ArrayList<Integer> a un tipo personalizado que internamente usa un buffer 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 tu caso, usar punteros no te gana nada si lo único que haces es acceder a la base de datos, donde Java podría ser más rápido) si la elección te 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.