2010-03-19 20 views
16

La pregunta realmente lo dice todo.¿Qué tan bien funciona Scala en comparación con Java?

La razón detrás de esta pregunta es que estoy a punto de comenzar un pequeño proyecto paralelo y quiero hacerlo en Scala. Estoy aprendiendo scala durante el último mes y ahora me siento cómodo trabajando con él. El compilador scala en sí es bastante lento (a menos que use fsc). Entonces, ¿qué tan bien funciona en JVM? Anteriormente trabajé en Groovy y lo había visto a veces más que java. Mi pregunta es cuán bien Scala funciona en JVM en comparación con Java. Sé que scala tiene algunas características muy buenas (FP, dynamic lang, estáticamente tipeado ...) pero al final del día necesitamos el rendimiento ...

+2

Tenga en cuenta que el compilador de Scala tiene mucho más trabajo que hacer que el compilador de Java. Es de esperar que no vaya a ser tan rápido como lo acostumbrado en idiomas más simples. –

Respuesta

25

La mayoría de mi trabajo usa Scala como un lenguaje de alto rendimiento. Si uno realmente presta mucha atención al rendimiento, Scala casi siempre es tan bueno como Java (si no equivalente). Si uno es descuidado, p. creaciones de objetos, puede ser muchas veces peor, como puede suceder en Java si utiliza una biblioteca que no se preocupa por las creaciones de objetos. (De hecho, mi código Scala es a menudo más rápido que mi código Java porque me resulta mucho más fácil hacer que mi código altamente optimizado sea conveniente de usar y reutilizar, pero el Java sería tan rápido o más rápido si solo tuviera más tiempo y más paciencia.)

Si quiere algunos datos que demuestren que Scala puede ser básicamente tan rápido como Java, consulte los resultados en el Computer Languages Benchmark Game. (Otra comparación menos útil pero interesante para la programación multinúcleo de alto rendimiento es Tim Bray's Wide Finder 2. Esto es menos útil porque el algoritmo no se define de antemano, por lo que una gran parte de las diferencias se reduce a las diferencias en el algoritmo)

+2

La creación de objetos en una Java JVM 1.5> moderna es prácticamente gratuita, esto es solo FUD. Scala es más lento que Java nativo debido a toda la indirección de todas las características del lenguaje específico de Scala al igual que Groovy. Debería esperar una penalización de velocidad de hasta 5 veces en comparación con Java en la misma JVM. –

+11

@Fuzzy: Estás completamente equivocado. Ve a los puntos de referencia a los que me he vinculado. ¿Apoyan su posición? ¿Te importa publicar otros que sí lo tienen? ¿Ha hecho microdefinición para decir qué tan rápido se compara la creación de objetos con una capa de indirección, y qué tan bien el JIT puede eliminar la indirección cuando no es realmente necesaria? (Pista: lo hice, y por eso publiqué lo que hice.) –

+10

@fuzzy Estoy respaldando a Rex aquí. La creación de objetos es barata, pero si todo lo que estás haciendo es un puñado de operaciones matemáticas en el ciclo interno, entonces, en comparación, la creación de objetos es muy costosa. –

13

Scala se compila en código de bytes y está tipado estáticamente, por lo que se pueden realizar muchas de las mismas optimizaciones que se pueden hacer para lenguajes tipados estáticos como Java (a diferencia de los lenguajes de tipado dinámico como Groovy). Entonces, comparar Groovy con Scala es comparar manzanas con naranjas.

Ahora, Java para la comparación Scala:

Usted puede esperar Scala estar a la par con Java en la mayoría de las situaciones. Scala puede ser lento si se programa estúpidamente, por ejemplo, los tonos de mezclas a través de los rasgos podrían proporcionar una sobrecarga que Java simple no tendría.

Pero ...

Si los rasgos son en realidad la solución de un problema complejo de buen gusto, a continuación, una solución en la llanura de Java tendría que hacer frente a esa misma complejidad. ¿Quién puede decir que la solución que escriba en Java utilizando sus propios patrones va a ser más eficiente que lo que obtiene de forma gratuita en Scala (recuerde, el compilador de Scala fue escrito por personas que probablemente sean mejores programadores que usted).

Por otro lado, si está utilizando funciones de idioma sin un buen motivo (por ejemplo, objetos Integer cuando las primitivas int simples sí lo hagan), su código será lento, lento, sin importar el idioma que utilice.

Además, considere la clase especial de aplicaciones basadas en solicitudes de respuesta que interactúan con una base de datos u otro recurso intensivo de E/S. El cuello de la botella no va a ser el operador "nuevo" o la sobrecarga de invocación del método virtual: seguramente será la E/S.

En resumen, el rendimiento entre Scala y Java es aproximadamente el mismo, y no debería ser la razón principal por la que elige uno sobre el otro en el 99% de los casos. Dado que el trabajo humano calificado es más costoso que el hardware, es mejor que elija el idioma en el que puede (o puede aprender) programar de manera más eficiente (incluidos sus compañeros de equipo). Si Scala le permite escribir una décima parte del código como Java, puede obtener un beneficio de 10X al usarlo.Si Scala te ralentiza 10 veces (porque es muy difícil de leer), ¡quédate con Java!

+5

Esto es todo cierto en teoría. En la práctica, si se miden las cosas en lugar de esperar cosas, el código Scala tiende a ser significativamente más lento que el código Java, al igual que en la práctica el código Java tiende a ser más lento que el código C++. El argumento "No te preocupes por la velocidad, tira el hardware al código lento" es menos cierto todos los días. En el lado del cliente, las netbooks y los teléfonos móviles NO son rápidos. En el lado del servidor, hay presión para reducir el consumo de energía. No vamos a volver al ASM afinado a mano, pero vale la pena pensar cuidadosamente qué es lo que Scala te compra. – Porculus

+1

En realidad, aún no he podido encontrar ninguna aceleración mensurable al portar cualquier programa de Scala a Java solo. –

+6

@Porculus: ¿Tiene alguna información real para respaldar su opinión? Aunque puedo estar de acuerdo con su comparación entre Java/C++, no veo cómo esto se aplica a Scala vs. Java. Es lo mismo que argumentar que GCC crea binarios que tienden a ser significativamente más lentos, porque usaste el analizador A en lugar del analizador B para C++. – soc

5

Acepto los comentarios de Rex en esta publicación, y tengo experiencia personal para apoyarlo. Convertí un applet de Processing de java a scala, sin cambiar ningún detalle de implementación, y ambos applets renderizaron un fotograma en ~ 6ms, con poca variación.

Cuestiones relacionadas