Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does IntelliJ IDEA compile Scala so slowly? [closed]

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 Java I could make small changes to my program, click the run button in netbeans, and BOOM, it's running, and over time compiling in scala seems to consume a lot of time. I hear that with many large projects a scripting language becomes very important because of the time compiling takes, a need that I didn't see arising when I was using Java.

But I'm coming from Java which as I understand it, is faster than any other compiled language, and is fast because of the reasons I switched to Scala(It's a very simple language).

So I wanted to ask, can I make Scala compile faster and will scalac ever be as fast as javac.

like image 637
user405163 Avatar asked Aug 16 '10 03:08

user405163


People also ask

Why IntelliJ IDEA is so slow?

IntelliJ requires quite a lot of memory. If you don't give it enough memory it will become slow.

How do I fix a compilation error in IntelliJ?

Invalidate Caches/Restart. Delete user config. Create a new project (trying to see if my current project files somehow all got messed up, but the problems persist even with new projects) Uninstall + Reinstall.


2 Answers

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.

like image 128
Martin Odersky Avatar answered Oct 08 '22 10:10

Martin Odersky


The Scala compiler is more sophisticated than Java's, providing type inference, implicit conversion, and a much more powerful type system. These features don't come for free, so I wouldn't expect scalac to ever be as fast as javac. This reflects a trade-off between the programmer doing the work and the compiler doing the work.

That said, compile times have already improved noticeably going from Scala 2.7 to Scala 2.8, and I expect the improvements to continue now that the dust has settled on 2.8. This page documents some of the ongoing efforts and ideas to improve the performance of the Scala compiler.

Martin Odersky provides much more detail in his answer.

like image 22
Aaron Novstrup Avatar answered Oct 08 '22 08:10

Aaron Novstrup