首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java编译速度与Scala编译速度

Java编译速度与Scala编译速度
EN

Stack Overflow用户
提问于 2010-08-16 11:22:57
回答 8查看 27.3K关注 0票数 101

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

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-08-16 12:07:27

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

也就是说,从Scala 2.7到Scala 2.8,编译时间已经有了明显的改善,我希望这种改进会继续下去,因为2.8已经尘埃落定。This page记录了一些正在进行的改进Scala编译器性能的努力和想法。

Martin Odersky provides much more detail in his answer.

票数 58
EN

Stack Overflow用户

发布于 2010-09-01 02:54:57

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

  1. 更高的启动开销

代码语言:javascript
复制
- 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需要配置为使用这两个选项中的任何一个,否则即使对于小文件,它的开销也很大。

  1. 使编译速度变慢。Scalac管理大约500到1000行/秒。Javac的管理能力大约是它的10倍。这有几个原因。

代码语言:javascript
复制
- 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,并结合良好的依赖分析,以便只需重新编译最小的文件集。我们也在努力做到这一点。

票数 460
EN

Stack Overflow用户

发布于 2010-08-31 17:03:13

您应该知道,Scala编译花费的时间至少比Java长一个数量级。原因如下:

  1. 命名约定(文件XY.scala文件不需要包含名为XY的类,并且可以包含多个顶级类)。因此,编译器可能不得不搜索更多的源文件来找到给定的类/特征/对象identifier.
  2. Implicits -大量使用隐式意味着编译器需要搜索给定方法的任何范围内的隐式转换,并对它们进行排序以找到“正确”的方法。(即,编译器在定位方法时具有大量增加的搜索域。)
  3. 类型系统- scala类型系统比Java的类型系统复杂得多,因此需要更多的CPU时间。
  4. 类型推断-类型推断的计算成本很高,并且javac在GenICode编译阶段不需要做的工作包括一个全副武装的作战工作站的8位模拟器,可以在GenICode编译阶段使用神奇的组合键CTRL-ALT-F12查看。
票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3490383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档