Scala(或JVM)是​​否曾经优化(功能)对象?

Ed *_*aub 5 jvm scala

在许多使用Scala的情况下,例如简单的,本地范围的函数调用,可以想象理论上通常可以完全摆脱函数对象.但AFAIK,JVM不知道如何做到这一点,我也不认为Scala会这样做.正确?

匿名函数对象是否始终密封?如果没有,那么内联可以做多少是非常严格的限制.正确?

是否有人知道任何计划的努力可能会解决这些优化问题?

另请参阅相关的纯Java问题:现代JVM是否优化了简单的内联匿名类分配?

(颂歌"不要太早优化","无关紧要",此时此刻非常多余且无用.)

Rex*_*err 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
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,第二个至少与第一个一样快(有时更快),尽管第二个看起来需要每隔一次迭代创建一个函数.