【问题标题】:Best (scala & other languages that target java vm) optimizations最佳(针对 java vm 的 scala 和其他语言)优化
【发布时间】:2011-06-16 08:18:50
【问题描述】:

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

请不要回答这个谈论 scala 在 java 之上的非常好的特性的问题,我只是在谈论性能。

另外,如果您还有没有实施的建议,请回答!

谢谢!

【问题讨论】:

  • "我知道生成的代码越远离 java,它的性能下降得越远。" - 我认为这不一定是真的。有些语言比其他语言更适合优化,但这与该语言与 Java 的接近程度没有任何关系。
  • 是的,确实不一定如此,但确实 vm 工程师针对 java 语言最常见的用例进行了更好的优化
  • 我不确定这个问题是否正确。生成的代码是字节码,因为编译后的javacode是字节码,所以编译后我想,它们是无法区分的。 AFAIK,jRuby、jython 等语言只是使用更多的反射,这使得程序变慢。
  • 是的,但您可以优化此字节码,使其生成运行速度更快的 JIT 代码;)

标签: java performance optimization scala programming-languages


【解决方案1】:

Scala 执行 support tail-call optimization,而 Java,仅通过 JVM,don't fully support yet

【讨论】:

  • +1。这是一个非常酷的优化,如果 JVM 最终也能得到支持,那就更好了。
  • 这真是一个很棒的优化!谢谢!
  • 似乎这和泛型专业化是他们执行的主要优化。很高兴知道,很好的参考!谢谢!
【解决方案2】:

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”模式就不会那么流行了。

【讨论】:

    【解决方案3】:

    也许这太微不足道/过时/众所周知,但 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();
    

    甚至可能(不确定)

     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 可以在这里做得更彻底(并利用有关实际硬件和使用模式的运行时知识)。

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

    【讨论】:

    • 是的,我知道优化字节码有点违背 java 的理念。但问题是,如果您使用了很多尚未被 Java 编译器优化的功能,那么您就很不幸——泛型专业化就是其中的一种优化。我真的很想知道可以做些什么来实现类似结构的行为,例如,在 java 中。
    • 我猜 Scala 有可能共享许多其他值(不可变的值);是吗?
    猜你喜欢
    • 2010-10-31
    • 2014-09-08
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多