在许多使用Scala的情况下,例如简单的,本地范围的函数调用,可以想象它通常理论上可能完全摆脱函数对象。但AFAIK,JVM不知道如何做到这一点,我也不认为Scala会这样做。正确的吗?
匿名函数对象是否始终密封?如果没有,那么内联可以做多少是非常严格的限制。正确的吗?
是否有人知道任何可能解决这些优化问题的计划工作?
另请参阅相关的纯Java问题:Does a modern JVM optimize simple inline anonymous class allocation?
(吟唱“不要太早优化”,“无关紧要”,等人此时非常多余且无用。)
答案 0 :(得分:5)
内联加逃逸分析可以做到这一点。如果您在JVM 7中使用编译报告,或者对以下两段代码进行基准测试,您可以自己演示:
def rfor(i0: Int, i1: Int)(f: Int => Unit) {
var i = i0
while (i <= i1) {
f(i)
i += 1
}
}
def whiley = {
var s = 0
var n = 1
while (n <= 500000000) {
val k = n >> 2
var i = 1
while (i <= 2) {
s += i*k
i += 1
}
n += 1
}
s
}
def rfory = {
var s = 0
var n = 0
while (n <= 500000000) {
val k = n >> 2
rfor(1, 2){ s += k * _ }
n += 1
}
s
}
在我的机器上,第二个至少与第一个一样快(有时更快),尽管第二个看起来需要每隔一次迭代创建一个函数。