我用Scala编程已经有一段时间了,我很喜欢它,但有一件事让我很恼火,那就是编译程序所花费的时间。这似乎是一件小事,但使用Java我可以对我的程序做一些小的修改,在netbeans中单击run按钮,然后它就开始运行了,随着时间的推移,在scala中编译似乎消耗了大量的时间。我听说在许多大型项目中,脚本语言变得非常重要,因为编译所需的时间,这是我在使用Java时没有看到的需求。
但我来自Java,据我所知,它比任何其他编译语言都要快,而且由于我切换到Scala(它是一种非常简单的语言)的原因,所以速度也很快。
所以我想问,我能让Scala编译得更快吗? scalac会不会像javac一样快?
发布于 2010-08-16 12:07:27
Scala编译器比Java编译器更复杂,提供了类型推断、隐式转换和更强大的类型系统。这些特性不是免费的,所以我不指望scalac能像javac那样快。这反映了程序员和编译器之间的权衡。
也就是说,从Scala 2.7到Scala 2.8,编译时间已经有了明显的改善,我希望这种改进会继续下去,因为2.8已经尘埃落定。This page记录了一些正在进行的改进Scala编译器性能的努力和想法。
发布于 2010-09-01 02:54:57
Scala编译器的速度(缺乏)有两个方面。
- 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.总体而言,scalac的启动开销预计为4-8秒,如果您第一次运行它,则会更长,这样磁盘缓存就不会被填满。
对于启动开销,Scala的答案是要么使用fsc,要么使用sbt进行连续构建。IntelliJ需要配置为使用这两个选项中的任何一个,否则即使对于小文件,它的开销也很大。
- 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.另一方面,一个1000行的Scala程序可能对应于一个2-3K行的Java程序,所以当以每秒行数计算时,一些较慢的速度必须与每行更多的功能进行权衡。
我们正在努力提高速度(例如,通过并行生成类文件),但在这方面不能期待奇迹。Scalac永远不会像javac那样快。我相信,解决方案将在于编译服务器,如fsc,并结合良好的依赖分析,以便只需重新编译最小的文件集。我们也在努力做到这一点。
发布于 2010-08-31 17:03:13
您应该知道,Scala编译花费的时间至少比Java长一个数量级。原因如下:
XY.scala文件不需要包含名为XY的类,并且可以包含多个顶级类)。因此,编译器可能不得不搜索更多的源文件来找到给定的类/特征/对象identifier.javac在GenICode编译阶段不需要做的工作包括一个全副武装的作战工作站的8位模拟器,可以在GenICode编译阶段使用神奇的组合键CTRL-ALT-F12查看。https://stackoverflow.com/questions/3490383
复制相似问题