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

Tej*_*eni 16 performance scala

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

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

Rex*_*err 25

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

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

  • @Fuzzy:你是完全错的.去看看我链接的基准.他们支持你的立场吗?关心发布其他人吗?你是否已经完成了微基准测试,以告诉对象创建与一层间接比较的速度有多快 - 以及当不需要真正需要时,JIT可以如何移除间接?(提示:我有,这就是我发布我所做的事情的原因.) (11认同)
  • @fuzzy我在这里支持雷克斯.对象创建很便宜,但如果你所做的只是内循环中的一些数学运算,那么相比之下,对象创建非常昂贵. (10认同)
  • @fuzzy:对象*分配*很便宜.对象*初始化*可以任意昂贵; 即使只是浅层复制构造器,如果你创建了足够多的对象,也会占用大量时间.你知道,你在函数代码中一直调用的复制构造函数,因为你使用的是不可变对象而不是可变状态...... (3认同)
  • 现代Java JVM 1.5>中的对象创建几乎是免费的,这只是FUD.Scala比本机Java慢,因为所有Scala特定语言功能的所有间接都像Groovy一样.与同一JVM上的Java相比,您应该期望高达5倍的速度惩罚. (2认同)

les*_*es2 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!

  • @Porculus:你有任何实际数据来支持你的意见吗?虽然我同意你在Java/C++之间的比较,但我没有看到它如何适用于Scala与Java.这与争论GCC创建往往明显更慢的二进制文件是一样的,因为您使用解析器A而不是解析器B用于C++. (6认同)
  • 这在理论上都是正确的.实际上,如果你测量事物而不仅仅是期望事物,Scala代码往往比Java代码慢得多,就像在实践中Java代码往往比C++代码慢."不要担心速度,在慢速代码中抛出硬件"的说法每天都不那么真实.在客户端,上网本和手机并不快.在服务器端,存在减少能源使用的压力.我们不会再回到手动调整的ASM,但是值得仔细考虑Scala为您购买的东西. (5认同)

nul*_*ace 5

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