Java 编译速度与 Scala 编译速度

2022-08-31 10:15:29

我已经在Scala中编程了一段时间,我喜欢它,但有一件事我很烦恼,那就是编译程序所需的时间。这似乎是一件小事,但是使用Java,我可以对我的程序进行小的更改,单击netbeans中的运行按钮,然后BOOM,它正在运行,随着时间的推移,在scala中编译似乎消耗了大量时间。我听说在许多大型项目中,脚本语言变得非常重要,因为编译需要时间,这是我在使用Java时没有看到的需求。

但是我来自Java,据我所知,它比任何其他编译语言都快,而且由于我切换到Scala(这是一种非常简单的语言)的原因,它的速度也很快。

所以我想问,我能不能让Scala编译得更快,scalac会像javac一样快。


答案 1

Scala编译器的速度(缺乏)有两个方面。

  1. 更大的启动开销

    • Scalac本身由许多必须加载和jit编译的类组成

    • Scalac 必须在类路径中搜索所有根包和文件。根据类路径的大小,这可能需要一到三秒钟的额外时间。

    总体而言,预计 scalac 的启动开销为 4-8 秒,如果第一次运行它,则不会填满磁盘缓存,则启动开销会更长。

    Scala对启动开销的回答是使用fsc或使用sbt进行连续构建。IntelliJ 需要配置为使用任一选项,否则即使对于小文件,其开销也非常大。

  2. 编译速度较慢。Scalac 管理大约 500 到 1000 行/秒。Javac管理了大约10倍。这有几个原因。

    • 类型推断代价高昂,特别是如果它涉及隐式搜索。

    • Scalac必须进行两次类型检查;一次根据 Scala 的规则,第二次根据 Java 的规则进行擦除。

    • 除了类型检查之外,从Scala到Java还有大约15个转换步骤,这些步骤都需要时间。

    • Scala通常比Java在每个给定的文件大小上生成更多的类,特别是如果函数式习语被大量使用。字节码生成和类编写需要时间。

    另一方面,1000行Scala程序可能对应于2-3K行Java程序,因此以每秒行数计算时,一些较慢的速度必须与每行的更多功能相平衡。

    我们正在努力提高速度(例如,通过并行生成类文件),但不能指望在这方面出现奇迹。Scalac永远不会像javac那样快。我相信解决方案将取决于像fsc这样的编译服务器以及良好的依赖关系分析,以便只需要重新编译最小的文件集。我们也在为此而努力。


答案 2

Scala编译器比Java的编译器更复杂,提供类型推断,隐式转换和更强大的类型系统。这些功能不是免费的,所以我不希望scalac像javac一样快。这反映了程序员完成工作和编译器完成工作之间的权衡。

也就是说,从Scala 2.7到Scala 2.8的编译时间已经有了显着改善,我预计现在2.8的尘埃落定,改进将继续。本页记录了一些正在进行的工作和想法,以提高Scala编译器的性能。

Martin Odersky在他的回答中提供了更多细节。


推荐