与Java相比,Scala的表现如何?

时间:2010-03-19 18:47:14

标签: performance scala

该问题实际上说明了一切。

这个问题背后的原因是我即将开始一个小型项目,并希望在Scala中进行。我正在学习过去一个月的scala,现在我很乐意使用它。 scala编译器本身很慢(除非你使用fsc)。那么它在JVM上的表现如何呢?我之前曾在groovy工作过,而且我看到有时候比java更有表现力。我的问题是与Java相比,scala在JVM上的表现如何。我知道scala有一些非常好的功能(FP,动态语言,静态类型......)但是当天结束我们需要表演......

3 个答案:

答案 0 :(得分:25)

我的大部分工作都使用Scala作为高性能语言。如果一个人真的非常注意性能,那么Scala几乎总是和Java一样好(如果不是等价的话)。如果一个人不注意,例如对象创建,它可能会更糟糕 - 如果你使用一个粗略对象创建的库,它可以在Java中。 (事实上​​,我的Scala代码通常比我的Java代码更快,因为我发现使高度优化的代码更容易使用和重用 - 但如果我有更多的时间和时间,Java会更快或更快耐心。)

如果您想要一些数据证明Scala基本上与Java一样快,请查看Computer Languages Benchmark Game上的结果。 (对于高吞吐量多核编程而言,另一个不太有用但仍然有趣的比较是Tim Bray的Wide Finder 2。这不太有用,因为算法没有提前定义,因此差异的很大一部分归结为算法的差异。 )

答案 1 :(得分:14)

Scala被编译为字节代码并且是静态类型的,因此可以为Java等静态类型语言(与Groovy等动态类型语言相对)完成许多相同的优化。因此,将Groovy与Scala进行比较是将苹果与橙子进行比较。

现在,Java与Scala比较:

在大多数情况下,您可以预期Scala与Java相提并论。如果你愚蠢地编写Scala,Scala可能会很慢,例如,通过Traits混合的音调可能会提供普通Java不具备的一些开销。

但是......

如果Traits实际上正在解决一个复杂的问题,那么普通Java中的解决方案就必须解决同样的复杂问题。谁能说你使用自己的模式在Java中编写的解决方案比在Scala中免费获得的更有效(记住,Scala编译器是由那些可能比你更好的程序员编写的)。

另一方面,如果您没有充分理由使用语言功能(例如,普通int原语时会使用Integer对象),无论您使用哪种语言,您的代码都会变得臃肿,缓慢,垃圾。

此外,请考虑与数据库或其他I / O密集型资源交互的特殊类型的基于请求 - 响应的应用程序。瓶颈不会是“新”运算符或虚拟方法调用开销 - 它几乎肯定是I / O.

总之,Scala和Java之间的性能大致相同,并且不应该是99%的情况下您选择其中一个的最大原因。由于熟练的人力劳动比计算机硬件更昂贵,因此最好选择能够(或可以学习)最有效地编程的语言(包括你的队友)。如果Scala允许您将代码的十分之一写为Java,那么使用它可能会获得10倍的好处。如果Scala减慢你10次(因为它太难阅读),坚持使用Java!

答案 2 :(得分:5)

我同意Rex在这篇文章中的评论,我有个人经验来支持它。我将Processing applet从java转换为scala,而不更改任何实现细节,并且这两个applet在~6ms内渲染了一个框架,几乎没有变化。