Java编译速度与Scala编译速度
我用Scala编程已经有一段时间了,我喜欢它,但有一件事让我很恼火,那就是编译程序所花的时间。这似乎是一件小事,但使用Java,我可以对我的程序进行一些小的更改,单击netbeans中的run按钮,然后BOOM,它正在运行,随着时间的推移,在scala中编译似乎会消耗很多时间。我听说在许多大型项目中,脚本语言变得非常重要,因为编译需要花费大量的时间,这是我在使用Java时没有看到的需求 但我来自Java,据我所知,Java比任何其他编译语言都快,而且速度快,这是因为我切换到Scala(这是一种非常简单的语言)的原因 所以我想问,我能不能让Scala编译得更快,scalac是否会像javac一样快。使用-它是一个作为后台任务的快速Scala编译器,不需要一直加载。它可以重用以前的编译器实例 我不确定Netbeans scala插件是否支持fsc(文档中说是这样),但我无法让它工作。尝试每晚构建插件。最新版本的(Eclipse)在管理增量编译方面做得更好 有关详细信息,请参阅“”Java编译速度与Scala编译速度,java,performance,scala,compilation,Java,Performance,Scala,Compilation,我用Scala编程已经有一段时间了,我喜欢它,但有一件事让我很恼火,那就是编译程序所花的时间。这似乎是一件小事,但使用Java,我可以对我的程序进行一些小的更改,单击netbeans中的run按钮,然后BOOM,它正在运行,随着时间的推移,在scala中编译似乎会消耗很多时间。我听说在许多大型项目中,脚本语言变得非常重要,因为编译需要花费大量的时间,这是我在使用Java时没有看到的需求 但我来自Java,据我所知,Java比任何其他编译语言都快,而且速度快,这是因为我切换到Scala(这是一种非
另一种解决方案是将(如本文所示)作为构建器集成到IDE中 但不是直接在Eclipse中,正如评论中提到的:
您不应该直接在Eclipse中使用FSC,因为Eclipse已经在表面下使用FSC了。
FSC基本上是驻留编译器之上的一个薄层,这正是Eclipse用来编译Scala项目的机制
最后,正如评论中提醒我的那样:
还包括某种“增量”编译(通过),尽管它和增强的增量编译正在为即将到来的0.9 sbt版本进行工作。Scala编译器比Java编译器更复杂,提供类型推断、隐式转换和更强大的类型系统。这些特性不是免费提供的,所以我不希望scalac能像javac一样快。这反映了程序员和编译器之间的权衡 也就是说,编译时间从Scala2.7到Scala2.8已经有了显著的改进,我希望在2.8尘埃落定之后,这种改进还会继续。记录了为提高Scala编译器的性能而正在进行的一些工作和想法
我相信这一点会被否决,但极为迅速的转变并不总是有利于质量或生产力 花时间更仔细地思考,执行更少的开发微周期。好的Scala代码更密集、更重要(即,没有附带的细节和复杂性)。这需要更多的思考,这需要时间(至少一开始)。您可以通过更少的代码/测试/调试周期(单个周期稍微长一点)取得良好的进展,并且仍然可以提高生产率和工作质量
简而言之:寻找一种更适合Scala的最佳工作模式。您应该知道,Scala编译至少需要比Java长一个数量级的时间来编译。原因如下:
XY.scala
文件不需要包含名为XY
的类,并且可能包含多个顶级类)。因此,编译器可能必须搜索更多源文件才能找到给定的类/特征/对象标识符javac
根本不需要做这项工作scalac
包括一个8位的全副武装作战站模拟器,可在GenICode编译阶段使用组合键CTRL-ALT-F12查看最好的Scala方法是使用IDEA和SBT。设置一个基本的SBT项目(如果您愿意,它会为您做),并在自动编译模式下运行它(命令
~compile
),当您保存项目时,SBT将重新编译它
您还可以将SBT插件用于IDEA,并将SBT操作附加到每个运行配置。SBT插件还为您提供了IDEA中的交互式SBT控制台
无论哪种方式(外部运行SBT或SBT插件),SBT都会保持运行,因此构建项目时使用的所有类都会“预热”和JIT,并且启动开销也会被消除。此外,SBT只编译需要它的源文件。这是迄今为止构建Scala程序最有效的方法。Scala编译器的速度(缺乏)有两个方面
- Scalac本身由许多必须加载和jit编译的类组成
- Scalac必须在类路径中搜索所有根包和文件。根据类路径的大小,这可能需要额外的一到三秒钟
- 类型推断代价高昂,尤其是