最好的(scala和其他针对java vm的语言)优化

时间:2011-01-27 06:17:37

标签: java performance optimization scala programming-languages

我刚刚阅读了关于scala generics specialization的实现,它确实引起了我的注意力,他们通过这个功能提高了速度。我想知道其他功能有哪些语言针对java vm实现,实际上使它们比java更好?我知道生成的代码越远离java,其性能就越低。所以我真的很想知道语言可以实现的其他功能,以便在java中实现更好的性能。

请不要回答这个问题,谈论scala在java之上的非常好的功能,我正在严格谈论性能。

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

谢谢!

3 个答案:

答案 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更好)之前,在这种情况下,您实际上需要更新代码。)