最佳(scala和其他针对JavaVM的语言)优化

最佳(scala和其他针对JavaVM的语言)优化,java,performance,optimization,scala,programming-languages,Java,Performance,Optimization,Scala,Programming Languages,我刚刚读到scala的实现,它确实吸引了我的注意力,因为他们通过这个特性实现了速度的提高。我想知道,针对java虚拟机的语言实现了哪些其他特性,使它们的性能比java更好?我知道,生成的代码越远离java,其性能就越下降。因此,我真的很想知道一种语言还可以实现哪些其他功能来在java中实现更好的性能 请不要回答这个问题谈论scala在java之上的非常好的特性,我说的是严格意义上的性能 此外,如果您有尚未实施的建议,请务必回答 谢谢大家! 这可能太琐碎/陈旧/众所周知,但Java编译器使用字符串

我刚刚读到scala的实现,它确实吸引了我的注意力,因为他们通过这个特性实现了速度的提高。我想知道,针对java虚拟机的语言实现了哪些其他特性,使它们的性能比java更好?我知道,生成的代码越远离java,其性能就越下降。因此,我真的很想知道一种语言还可以实现哪些其他功能来在java中实现更好的性能

请不要回答这个问题谈论scala在java之上的非常好的特性,我说的是严格意义上的性能

此外,如果您有尚未实施的建议,请务必回答


谢谢大家!

这可能太琐碎/陈旧/众所周知,但Java编译器使用字符串池和StringBuilder优化字符串文本和连接:

 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();
甚至可能(不确定)

此外,Java编译器优化的重点已经从编译到字节码(javac)转移到从字节码到机器码(Hotspot)的编译。我认为javac中曾经有过更多的优化,但他们发现,考虑到Hotspot可以在这里完成更彻底的工作(并利用有关实际硬件和使用模式的运行时知识),这有点过早


另一个有趣的方面是,热点优化可以在编写和编译代码很久之后提高性能。例如,上面的StringBuilder优化用于使用Java5之前的StringBuffer类(效率稍低)。为了获得最新的改进,您需要重新编译代码(这仍然比之前手动优化使用StringBuffer要好,在这种情况下,您实际上需要更新代码)。

Scala做到了这一点,Java仅通过JVM就做到了这一点。

Scala优化了以下内容

val nullSafeToString = "" + foo

Java没有,在Java中它看起来像

val nullSafeToString = new StringBuilder("").append(foo)
这需要比Scala更简单的代码多4倍的字节码,并创建一个新的
StringBuilder
实例和一个无用的
String

一方面,JVM支持他们计划在Java中使用的东西,即使JVM只执行字节码

为了更好地支持函数式(tailcalls)和非类型化语言(InvokeDynamic),有些功能已经缺失了很多年

但另一方面,我感到惊讶的是,JIT编译器可以毫不费力地优化高度抽象的代码和间接层,最终代码的执行速度与Java代码一样快


我认为如果JVM不能通过escape分析删除这些简单的
隐式
+
类RichFoo
模式的实例创建,那么“Pimp My Library”模式就不会那么流行。

是的,我知道优化字节码有点违背java的理念。但问题是,如果您使用了很多java编译器还没有很好优化的特性,那么您就走运了——泛型专门化就是其中之一。我真的很想知道可以做些什么来实现类似结构的行为,例如在java中;是吗?+1。这是一个非常酷的优化,如果JVM最终也能得到支持,那就更好了。这真是一个很棒的优化!谢谢似乎这和泛型专门化是它们执行的主要优化。很高兴知道,也很有参考价值!谢谢“我知道生成的代码越远离java,其性能就越下降。”-我认为这不一定是真的。有些语言比其他语言更适合优化,但这与该语言与Java的接近程度无关。是的,这不一定是真的,但是虚拟机工程师确实能够更好地优化java语言最常见的用例。我不确定这个问题是否正确。生成的代码是字节码,就像编译过的Java代码是字节码一样,所以编译后,我认为它们是不可区分的。好吧,jRuby、jython等语言只是使用了更多的反射,这会使程序速度变慢。是的,但您可以优化此字节码,使其生成运行更快的JIT代码;)
val nullSafeToString = String.valueOf(foo)
val nullSafeToString = new StringBuilder("").append(foo)