Scala代码何时执行堆分配?

Scala代码何时执行堆分配?,scala,Scala,我已经编写了很多高性能Java代码,过去的经验告诉我,要获得最高性能,最重要的一点是要充分了解垃圾收集器的负载,并努力减少关键循环中的负载。例如,加密哈希函数的编写方式应确保它们从不分配任何内存 在Java1.5之前,很容易准确地知道Java代码何时会编译成执行堆分配的JVM字节码:只有Java源代码中的“new”关键字会导致堆分配。在Java-1.5之后,您只需看看新语言特性(如int->Integer自动转换)的“去糖化” 我真的,真的,真的很难为Scala找到一个等价的答案,这是一个问题。

我已经编写了很多高性能Java代码,过去的经验告诉我,要获得最高性能,最重要的一点是要充分了解垃圾收集器的负载,并努力减少关键循环中的负载。例如,加密哈希函数的编写方式应确保它们从不分配任何内存

在Java1.5之前,很容易准确地知道Java代码何时会编译成执行堆分配的JVM字节码:只有Java源代码中的“new”关键字会导致堆分配。在Java-1.5之后,您只需看看新语言特性(如int->Integer自动转换)的“去糖化”

我真的,真的,真的很难为Scala找到一个等价的答案,这是一个问题。我错过了吗?我在哪里可以找到关于Scala编译器何时会生成堆分配字节码的清晰、全面的解释?不,scala编译器源代码不是答案,因为它会随着时间的推移而变化——我问的是语言,而不是一个特定的编译器


编辑:忘了提到应用于字符串的Java原语“+”是一种语言级构造,它会导致堆分配。因此,Java-1.5之前的版本应该是“新的+字符串”。

我强烈建议了解JD-GUI程序,它将.class文件反编译为Java ish代码,并让您可以检查它。我从中了解了很多Scala代码是如何编译的


Rex Kerr进行数字运算,并参与效率分析,包括库代码。也许他的答案会很有启发性,如果可以搜索的话。我在下面的小贡献被推迟了,因为我及时准备了晚餐去看《神奇女侠》。通常的关键字会起作用
http://stackoverflow.com/search?q=user%3A247533+装箱+原语
,因为几乎每个Rex Kerr的答案都是严肃而有用的。谢谢som snytt。我知道装箱原语,“scala何时使用装箱原语”这个问题的答案肯定是我问题答案的一部分,但离完整答案还有很长的路要走。例如,scala的lambda表达式在这个意义上不是原语,但它们是一种需要堆分配的语言构造(至少在一般情况下)……也许我应该问scala的堆分配行为是否可预测且定义良好,我想这是我真正想知道的,但这样问有可能引发语言大战。我想你可能误解了这个问题。。。我已经知道如何判断一个特定的程序是否会产生堆分配字节码。我试图了解一般规则,这样我就不必对我编写的每个Scala程序进行反编译。如果我必须这样做,我就不会写太多:)当然。我是说最好的方法是自己建立映射。大多数东西都有一个相对简单的解释,但它显然比Java的复杂得多。我应该修正这一点,说任何涉及到专门注释的东西都像阅读无限笑话的阿拉姆语翻译一样简单。