Java compile speed vs Scala compile speed

前端 未结 8 1463
陌清茗
陌清茗 2020-11-28 16:07

I\'ve been programming in Scala for a while and I like it but one thing I\'m annoyed by is the time it takes to compile programs. It\'s seems like a small thing but with Ja

相关标签:
8条回答
  • 2020-11-28 17:10

    There are two aspects to the (lack of) speed for the Scala compiler.

    1. Greater startup overhead

      • Scalac itself consists of a LOT of classes which have to be loaded and jit-compiled

      • Scalac has to search the classpath for all root packages and files. Depending on the size of your classpath this can take one to three extra seconds.

      Overall, expect a startup overhead of scalac of 4-8 seconds, longer if you run it the first time so disk-caches are not filled.

      Scala's answer to startup overhead is to either use fsc or to do continuous building with sbt. IntelliJ needs to be configured to use either option, otherwise its overhead even for small files is unreasonably large.

    2. Slower compilation speed. Scalac manages about 500 up to 1000 lines/sec. Javac manages about 10 times that. There are several reasons for this.

      • Type inference is costly, in particular if it involves implicit search.

      • Scalac has to do type checking twice; once according to Scala's rules and a second time after erasure according to Java's rules.

      • Besides type checking there are about 15 transformation steps to go from Scala to Java, which all take time.

      • Scala typically generates many more classes per given file size than Java, in particular if functional idioms are heavily used. Bytecode generation and class writing takes time.

      On the other hand, a 1000 line Scala program might correspond to a 2-3K line Java program, so some of the slower speed when counted in lines per second has to balanced against more functionality per line.

      We are working on speed improvements (for instance by generating class files in parallel), but one cannot expect miracles on this front. Scalac will never be as fast as javac. I believe the solution will lie in compile servers like fsc in conjunction with good dependency analysis so that only the minimal set of files has to be recompiled. We are working on that, too.

    0 讨论(0)
  • 2020-11-28 17:12

    The latest revisions of Scala-IDE (Eclipse) are much better atmanaging incremental compilation.

    See "What’s the best Scala build system?" for more.


    The other solution is to integrate fsc - Fast offline compiler for the Scala 2 language - (as illustrated in this blog post) as a builder in your IDE.

    alt text

    But not in directly Eclipse though, as Daniel Spiewak mentions in the comments:

    You shouldn't be using FSC within Eclipse directly, if only because Eclipse is already using FSC under the surface.
    FSC is basically a thin layer on top of the resident compiler which is precisely the mechanism used by Eclipse to compile Scala projects.


    Finally, as Jackson Davis reminds me in the comments:

    sbt (Simple build Tool) also include some kind of "incremental" compilation (through triggered execution), even though it is not perfect, and enhanced incremental compilation is in the work for the upcoming 0.9 sbt version.

    0 讨论(0)
提交回复
热议问题