最佳(针对Java虚拟机的Scala和其他编程语言)优化方案。

6
我刚刚在阅读有关Scala实现泛型特化的文章时,我发现这个特性大幅提升了其速度,引起了我的关注。我想知道其他面向Java虚拟机的语言还实现了哪些功能,使它们的性能比Java更好?我知道生成代码与Java越远,其性能也越低。所以我真的很想知道一种语言可以实现哪些其他功能,以在Java中实现更好的性能。

请不要回答这个问题,只谈及Scala相对于Java真正优秀的功能。我只是关注性能。

如果您有仍未实现的建议,请回答!

谢谢!


我知道生成的代码距离Java越远,性能就会越低这种说法并不一定正确。有些编程语言比其他语言更容易进行优化,但这与该语言与Java的接近程度无关。 - Jesper
是的,实际上这并不一定是真的,但确实是虚拟机工程师通过优化最常见的Java语言使用情况来提高性能。 - Waneck
我不确定这个问题是否正确。生成的代码是字节码,就像Java代码一样,编译后就是字节码,所以在编译后,它们是无法区分的。据我所知,像jRuby、jython等语言只是使用了更多的反射,这使得程序变慢了。 - user unknown
是的,但你可以优化这个字节码,使其生成更快运行的JIT代码 ;) - Waneck
3个回答

13

+1. 这是一个非常酷的优化,如果JVM最终也支持它,那就更好了。 - Thilo
这真是一个很棒的优化!谢谢! - Waneck
看起来这和泛型专业化是他们执行的主要优化。很好知道,也是个很好的参考!谢谢! - Waneck

5

Scala优化诸如此类的事情

val nullSafeToString = "" + foo

to

val nullSafeToString = String.valueOf(foo)

Java中并不会这样,实际上它看起来像是

val nullSafeToString = new StringBuilder("").append(foo)

这段代码比Scala简单的代码多4倍字节码,并创建了一个新的StringBuilder实例和一个无用的String

一方面,JVM被设计成支持Java计划中要使用的东西,即使JVM只执行字节码。

有些功能(如尾调用)和未经类型检查的语言(InvokeDynamic)已经缺失很久了。

但另一方面,我很惊讶JIT编译器可以轻松优化抽象代码和间接层次,并最终生成与Java代码一样快的代码。

我认为,如果JVM不能通过逃逸分析消除这些简单的implicit+class RichFoo模式的实例创建,那么“Pimp My Library”模式不会那么受欢迎。


3
也许这太琐碎/陈旧/众所周知了,但Java编译器使用String池和StringBuilders来优化字符串文字和连接。
 String a = "a";
 String b = "a";
 String c = a + b + someUserInput;

实际上会更接近于

 String a = "a";
 String b = a;
 String a_b = "aa";
 String c = new StringBuilder(a_b).append(someUserInput).toString();

或许甚至可能(不确定)

 String a_b = "aa";
 String a = a_b.substring(0,1);
 String b = a;
 String c = new StringBuilder(a_b).append(someUserInput).toString();

此外,Java编译器的优化重点已经从字节码(javac)编译转移到了从字节码到机器码(Hotspot)的编译。我认为以前javac中有更多的优化,但是他们发现这有点过早了,因为Hotspot可以在这里做得更彻底(并且利用关于实际硬件和使用模式的运行时知识)。另一个有趣的方面是,Hotspot优化可以在代码编写和编译之后长时间提高性能。例如,上面的StringBuilder优化在Java 5之前曾经使用(稍微不太高效的)StringBuffer类。为了获得最新的改进,您需要重新编译代码(这仍然比手动优化使用StringBuffer要好,在这种情况下,您实际上需要更新代码)。

是的,我知道优化Java字节码有点违背了它的哲学。但问题在于,如果你正在使用许多Java编译器尚未很好优化的功能,那么你就会很倒霉——泛型特化就是其中之一。我真的很想知道如何在Java中实现类似结构体的行为。 - Waneck
我猜Scala有潜力分享许多其他值(不可变的值); 是吗? - Raphael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接