Velocidad de comstackción de Java vs velocidad de comstackción de Scala

He estado progtwigndo en Scala por un tiempo y me gusta, pero una cosa que me molesta es el tiempo que lleva comstackr progtwigs. Parece una cosa pequeña, pero con Java podría hacer pequeños cambios en mi progtwig, hacer clic en el botón de ejecución en netbeans, y BOOM, se está ejecutando, y con el tiempo comstackr en scala parece consumir mucho tiempo. Escuché que con muchos proyectos grandes, el lenguaje de script se vuelve muy importante debido al tiempo que tarda la comstackción, una necesidad que no vi surgir cuando estaba usando Java.

Pero vengo de Java que, como yo lo entiendo, es más rápido que cualquier otro lenguaje comstackdo, y es rápido debido a las razones por las que cambié a Scala (es un lenguaje muy simple).

Así que quería preguntar, ¿puedo hacer que Scala compile más rápido y scalac será tan rápido como javac?

    El comstackdor de Scala es más sofisticado que el de Java, ya que proporciona inferencia de tipo, conversión implícita y un sistema de tipos mucho más poderoso. Estas características no son gratis, así que no esperaría que scalac fuera tan rápido como javac. Esto refleja una compensación entre el progtwigdor que hace el trabajo y el comstackdor que hace el trabajo.

    Dicho esto, los tiempos de comstackción ya han mejorado notablemente pasando de Scala 2.7 a Scala 2.8, y espero que las mejoras continúen ahora que el polvo se ha asentado en 2.8. Esta página documenta algunos de los esfuerzos e ideas en curso para mejorar el rendimiento del comstackdor de Scala.

    Martin Odersky proporciona muchos más detalles en su respuesta.

    Hay dos aspectos de la (falta de) velocidad para el comstackdor de Scala.

    1. Mayor sobrecarga de inicio

      • Scalac en sí consiste en MUCHAS clases que deben ser cargadas y comstackdas por jit

      • Scalac debe buscar en el classpath todos los paquetes y archivos raíz. Dependiendo del tamaño de su classpath esto puede tomar de uno a tres segundos extra.

      En general, se espera una sobrecarga de inicio de scalac de 4-8 segundos, más tiempo si la ejecuta por primera vez, por lo que las cachés de disco no se llenan.

      La respuesta de Scala a la sobrecarga de inicio es usar fsc o hacer construcción continua con sbt. IntelliJ necesita configurarse para usar cualquiera de las opciones, de lo contrario su sobrecarga incluso para archivos pequeños es excesivamente grande.

    2. Velocidad de comstackción más lenta. Scalac maneja alrededor de 500 hasta 1000 líneas / seg. Javac maneja alrededor de 10 veces eso. Hay varias razones para esto.

      • La inferencia de tipo es costosa, en particular si implica una búsqueda implícita.

      • Scalac tiene que hacer una verificación de tipo dos veces; una vez según las reglas de Scala y una segunda vez después del borrado de acuerdo con las reglas de Java.

      • Además del control de tipos, hay unos 15 pasos de transformación para pasar de Scala a Java, lo que lleva tiempo.

      • Scala generalmente genera muchas más clases por tamaño de archivo dado que Java, en particular si se usan mucho las expresiones funcionales. La generación de bytecódigos y la escritura de clases lleva tiempo.

      Por otro lado, un progtwig Scala de 1000 líneas podría corresponderse con un progtwig Java de línea de 2-3K, por lo que parte de la velocidad más lenta cuando se cuenta en líneas por segundo tiene que equilibrarse con una mayor funcionalidad por línea.

      Estamos trabajando en mejoras de velocidad (por ejemplo, generando archivos de clase en paralelo), pero uno no puede esperar milagros en este frente. Scalac nunca será tan rápido como javac. Creo que la solución estará en servidores de comstackción como fsc junto con un buen análisis de dependencias, de modo que solo se recompile el conjunto mínimo de archivos. Estamos trabajando en eso, también.

    Debe tener en cuenta que la comstackción de Scala toma al menos un orden de magnitud más largo que Java para comstackr. Las razones para esto son las siguientes:

    1. Convenciones de nomenclatura (un archivo XY.scala no necesita contener una clase llamada XY y puede contener múltiples clases de nivel superior). Por lo tanto, el comstackdor debe buscar más archivos fuente para encontrar un identificador de clase / rasgo / objeto dado.
    2. Implicits: el uso intensivo de implícitos significa que el comstackdor necesita buscar cualquier conversión implícita dentro del scope para un método dado y clasificarlos para encontrar el “correcto”. ( es decir, el comstackdor tiene un dominio de búsqueda enormemente aumentado al ubicar un método ) .
    3. El sistema de tipos: el sistema de tipo scala es mucho más complicado que Java y, por lo tanto, requiere más tiempo de CPU.
    4. Inferencia de tipo: la inferencia de tipo es computacionalmente costosa y un trabajo que javac no necesita hacer en absoluto
    5. scalac incluye un simulador de 8 bits de una estación de batalla totalmente armada y operativa, visible con la combinación de teclas mágicas CTRL-ALT-F12 durante la fase de comstackción GenICode .

    La mejor manera de hacer Scala es con IDEA y SBT. Configure un proyecto SBT elemental (que lo hará por usted, si lo desea) y ejecútelo en modo de comstackción automática (comando ~compile ) y cuando guarde su proyecto, SBT lo recomstackrá.

    También puede usar el complemento SBT para IDEA y adjuntar una acción SBT a cada una de sus configuraciones de ejecución. El complemento SBT también le ofrece una consola interactiva SBT dentro de IDEA.

    De cualquier manera (SBT ejecutándose externamente o el complemento SBT), SBT se mantiene funcionando y, por lo tanto, todas las clases utilizadas en la construcción de su proyecto se “calientan” y JIT-ed y la sobrecarga de arranque se elimina. Además, SBT comstack solo los archivos fuente que lo necesitan. Es, de lejos, la forma más eficiente de crear progtwigs Scala.

    Las últimas revisiones de Scala-IDE (Eclipse) son mucho mejores en la administración de la comstackción incremental.

    Consulte ” ¿Cuál es el mejor sistema de comstackción de Scala? ” Para obtener más información.


    La otra solución es integrar fsc: comstackdor sin conexión rápida para el lenguaje Scala 2 (como se ilustra en esta publicación de blog ) como creador en su IDE.

    texto alternativo

    Pero no directamente en Eclipse, como menciona Daniel Spiewak en los comentarios:

    No debe usar FSC directamente en Eclipse, aunque solo sea porque Eclipse ya está utilizando FSC debajo de la superficie.
    FSC es básicamente una capa delgada sobre el comstackdor residente, que es precisamente el mecanismo utilizado por Eclipse para comstackr los proyectos de Scala.


    Finalmente, como Jackson Davis me recuerda en los comentarios:

    sbt (Simple Build Tool) también incluye algún tipo de comstackción “incremental” (a través de la ejecución desencadenada ), aunque no es perfecta , y la comstackción incremental mejorada está en el trabajo para la próxima versión de 0.9 sbt.

    Use fsc : es un comstackdor de scala rápido que se encuentra como una tarea en segundo plano y no necesita cargar todo el tiempo. Puede reutilizar la instancia del comstackdor anterior.

    No estoy seguro si el plugin scala de Netbeans admite fsc (la documentación lo dice), pero no pude hacerlo funcionar. Pruebe las comstackciones nocturnas del complemento.

    Puede usar el plugin JRebel, que es gratuito para Scala. Así que puedes “desarrollar en el depurador” y JRebel siempre volvería a cargar la clase modificada en el acto.

    Leí una statement en alguna parte del propio Martin Odersky en la que dice que las búsquedas de implicits (el comstackdor debe asegurarse de que no haya más de una sola implícita para la misma conversión para descartar ambigüedades) puede mantener ocupado al comstackdor. Por lo tanto, podría ser una buena idea manejar las implicidades con cuidado.

    Si no tiene que ser 100% Scala, sino también algo similar, podrías darle una oportunidad a Kotlin .

    – Oliver

    Estoy seguro de que esto se votará negativamente, pero un cambio extremadamente rápido no siempre conduce a la calidad o la productividad.

    Tómese el tiempo para pensar con más cuidado y ejecutar menos micro ciclos de desarrollo. El buen código de Scala es más denso y más esencial (es decir, sin detalles y complejidad incidentales). Exige más reflexión y eso lleva tiempo (al menos al principio). Puede progresar bien con menos ciclos de prueba / corrección de código que son individualmente un poco más largos y aún mejoran su productividad y la calidad de su trabajo.

    En resumen: busque un patrón de trabajo óptimo más adecuado para Scala.