为什么Scala程序的编译速度非常慢?

为什么Scala程序的编译速度非常慢?,scala,playframework,Scala,Playframework,过去两个月我一直在使用Scala。我还在一个小应用程序中使用Play框架。我观察到,即使是打印“Hello World”的程序,编译也非常慢。为什么这么慢?有没有减少时间的建议?好吧,这是一个重复的问题,但因为它包含了另一个更实际的部分,我还是会尝试给出一个答案 首先,编译速度很慢,因为该语言具有丰富的功能。当然,在一些例子中,具有几乎相同特性集的语言编译速度更快,但我们拥有我们所拥有的。我首先想到的是: 类型推断 隐式解析 宏观扩张 类型级编程,导致大量的特定类(匿名类),这些类都需要考虑

过去两个月我一直在使用Scala。我还在一个小应用程序中使用Play框架。我观察到,即使是打印“Hello World”的程序,编译也非常慢。为什么这么慢?有没有减少时间的建议?

好吧,这是一个重复的问题,但因为它包含了另一个更实际的部分,我还是会尝试给出一个答案

首先,编译速度很慢,因为该语言具有丰富的功能。当然,在一些例子中,具有几乎相同特性集的语言编译速度更快,但我们拥有我们所拥有的。我首先想到的是:

  • 类型推断
  • 隐式解析
  • 宏观扩张
  • 类型级编程,导致大量的特定类(匿名类),这些类都需要考虑
要获得更详细的答案,我建议您向Scala的创建者咨询

至于问题的第二部分,这取决于您如何编译:

  • 如果您使用bare
    scalac
    ,则无法获得更高的速度,因为您必须反复启动separate
  • 如果您使用
    sbt
    ,内置的增量编译器(服务器)将为您服务:
  • 如果您使用IntelliJ IDEA,它还有它的增量编译器:
  • 如果您使用Typesafe Activator(即基本上您使用的是
    sbt
    ),它也会使用
    sbt服务器
我认为在你的情况下,坚持使用Activator是最好的选择,因为你已经在使用Play了。但请记住,这不是一个灵丹妙药:第一次编译仍然很慢,后续运行的速度取决于对代码进行了多少更改


啊,还有一个硬件方面。不用说,强大的CPU、足够的RAM和快速(最好是SSD)磁盘驱动器肯定会降低编译速度。

在您的情况下,编译速度有多快

scalac的速度受两个因素限制:

  • 这是一个在JVM上运行的相当大的程序。因此,启动时间不是很长,因为必须(1)启动JVM(2)将scalac加载到JVM中(3)JIT编译大部分内容以提高速度。2-4秒的启动时间是典型的,scalac的前几次运行并不是很快。如果您的设置是正确的,这将通过scalac在运行的JVM中保持驻留和“温暖”来缓解。sbt和所有IDE都是这样做的。我建议使用这些选项中的一个,或者,如果必须从命令行编译,请使用“fsc”,这也会使编译器驻留。(举个例子:人们通常不会抱怨REPL的速度,但是REPL和其他人使用相同的scalac。不同之处在于编译器保持常驻状态)

  • 即使是完全预热的scalac也必须处理有时需要复杂类型推断的程序。因此,对于具有非常简单的类型系统(如Go)的语言,它的速度比不上编译器。在我3岁的MacBookPro上,我看到编译速度为500-800行/秒。这并没有打破任何世界纪录,但对于增量编译来说已经足够了,而增量编译正是IDE和sbt现在所做的。我当前的项目大约有5万行代码,但我基本上从不在IDE(用于Eclipse的Scala IDE)中等待编译器,因为增量编译足够快。有些人认为编译速度低于这个速度。这通常是因为它们使用的构造(通常从库中导入)编译成本非常高,例如复杂的隐式参数层次结构


  • 不幸的是,编译时间对scala来说绝对是个问题。我喜欢这种语言,但我想我们必须接受它。看到目标——“编译至少与java一样快”,用于理论回答,认为斯卡拉的类型系统是图灵完成,这意味着编译实际上可以占用无限长的可能副本。