6

Estaba leyendo acerca de la implementación de scala de generics specialization, y realmente me llamó la atención el aumento de velocidad que lograron con esta característica. Me preguntaba qué otras características tienen los lenguajes dirigidos a Java vm implementados que realmente los hicieron funcionar mejor que Java. Sé que cuanto más se aleje el código generado de java, mayor será su rendimiento. Entonces realmente me pregunto qué otras características puede implementar un lenguaje para lograr un mejor rendimiento en Java.Las mejores optimizaciones (scala y otros idiomas que se dirigen a java vm)

Por favor, no responda esta pregunta hablando de las características realmente agradables de Scala además de Java, estoy hablando estrictamente de rendimiento.

Además, si tiene sugerencias que todavía no se implementaron, ¡responda!

¡Gracias!

+0

"Sé que cuanto más se aleje el código generado de Java, más se reduce su rendimiento". - No creo que esto sea necesariamente cierto. Algunos lenguajes se prestan mejor a la optimización que otros, pero en realidad no tiene nada que ver con cuán cerca está Java de ese lenguaje. – Jesper

+0

Sí, realmente no es necesariamente cierto, pero es cierto que los ingenieros de vm optimizan mejor para los casos de uso que son más comunes en el lenguaje Java – Waneck

+0

No estoy seguro de si la pregunta es incluso correcta. El código generado es bytecode, ya que javacode, compilado, es bytecode, así que después de la compilación, pensé, son indistinguibles. AFAIK, los idiomas como jRuby, jython, etc. solo usan mucha más reflexión, lo que hace que los programas sean más lentos. –

Respuesta

13

Scala hace support tail-call optimization, que Java, a través de la JVM solo, don't fully support yet.

+0

+1. Esa es una optimización muy buena, y si la JVM eventualmente obtiene soporte para ella también, eso sería aún mejor. – Thilo

+0

¡eso es realmente una gran optimización! ¡Gracias! – Waneck

+0

parece que esto y la especialización en genéricos son las principales optimizaciones que realizan. ¡Genial para saber y gran referencia! ¡Gracias! – Waneck

3

Tal vez esto es demasiado trivial/edad/conocida pero el compilador Java optimiza literales de cadena y concatenaciones utilizando un grupo de cadena y StringBuilders:

String a = "a"; 
String b = "a"; 
String c = a + b + someUserInput; 

va a ser en realidad más cerca de

String a = "a"; 
String b = a; 
String a_b = "aa"; 
String c = new StringBuilder(a_b).append(someUserInput).toString(); 

o quizás incluso (no estoy seguro)

String a_b = "aa"; 
String a = a_b.substring(0,1); 
String b = a; 
String c = new StringBuilder(a_b).append(someUserInput).toString(); 

Además, el objetivo de la optimización para el compilador de Java ha pasado de la compilación a bytecode (javac) a la compilación de bytecode a código de máquina (Hotspot). Creo que solía haber más optimizaciones en javac, pero han encontrado que es un poco prematuro dado que Hotspot puede hacer un trabajo mucho más completo aquí (y aprovechar el conocimiento del tiempo de ejecución sobre el hardware real y los patrones de uso).

Otro aspecto interesante de esto es que las optimizaciones de Hotspot pueden mejorar el rendimiento mucho después de que se haya escrito y compilado el código. Por ejemplo, la optimización de StringBuilder anterior se usa para usar la clase StringBuffer (un poco menos eficiente) antes de Java 5. Para obtener las últimas mejoras, debería volver a compilar el código (que es mejor que tener la optimización manual para usar StringBuffer antes, en cuyo caso necesitarías actualizar el código).

+0

sí, sé que está en contra de la filosofía de java optimizar su bytecode. Pero la cuestión es que si está utilizando mucho una característica que no está muy bien optimizada por el compilador de Java todavía, no tiene suerte, la especialización en genéricos es una de esas optimizaciones. Realmente me pregunto qué se puede hacer para implementar estructuras como el comportamiento, por ejemplo, en Java. – Waneck

+0

Supongo que Scala tiene el potencial de compartir muchos otros valores (los inmutables); ¿lo hace? – Raphael

5

Scala optimiza cosas como

val nullSafeToString = "" + foo 

a

val nullSafeToString = String.valueOf(foo) 

Java no, en Java parece que

val nullSafeToString = new StringBuilder("").append(foo) 

que tiene 4 veces más el código de bytes de código más simple de Scala y crea una nueva instancia de StringBuilder y un inútil String.

Por un lado, el JVM se hizo para soportar las cosas que habían planeado usar en Java, incluso si el JVM solo ejecuta bytecode.

Hay características que faltan por edades para admitir mejor los lenguajes funcionales (tailcalls) y no tipificados (InvokeDynamic).

Pero, por otro lado, me sorprende lo fácil que es que el compilador JIT pueda optimizar el código muy abstraído y las capas de indirección y terminar con un código tan rápido como el código Java.

Creo que el patrón "Pimp My Library" no sería tan popular si la JVM no podía eliminar las creaciones de instancias de estos simples patrones implicit + class RichFoo con análisis de escape.

Cuestiones relacionadas