我刚刚阅读了关于scala generics specialization的实现,它确实引起了我的注意力,他们通过这个功能提高了速度。我想知道其他功能有哪些语言针对java vm实现,实际上使它们比java更好?我知道生成的代码越远离java,其性能就越低。所以我真的很想知道语言可以实现的其他功能,以便在java中实现更好的性能。
请不要回答这个问题,谈论scala在java之上的非常好的功能,我正在严格谈论性能。
如果您的建议仍未实施,请回答!
谢谢!
答案 0 :(得分:13)
Scala只通过JVM support tail-call optimization做了don't fully support yet,这是Java。
答案 1 :(得分:5)
Scala优化了
之类的东西val nullSafeToString = "" + foo
到
val nullSafeToString = String.valueOf(foo)
Java没有,在Java中它看起来像
val nullSafeToString = new StringBuilder("").append(foo)
比Scala的简单代码多4倍的字节码,并创建一个新的StringBuilder
实例和一个无用的String
。
一方面,JVM用于支持他们计划在Java中使用的东西,即使JVM只执行字节码。
为了更好地支持功能(尾调用)和无类型语言(InvokeDynamic),有许多功能可能会缺少很长时间。
但另一方面,我很惊讶JIT编译器可以轻松地优化大量抽象代码和间接层,最终代码执行速度与Java代码一样快。
如果JVM无法通过转义分析删除这些简单implicit
+ class RichFoo
模式的实例创建,我认为“Pimp My Library”模式不会那么流行。
答案 2 :(得分:3)
也许这太简单/过时/众所周知但Java编译器使用字符串池和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更好)之前,在这种情况下,您实际上需要更新代码。)