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

时间:2012-02-25 04:14:45

标签: scala jvm

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

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

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

另请参阅相关的纯Java问题:Does a modern JVM optimize simple inline anonymous class allocation?

(吟唱“不要太早优化”,“无关紧要”,等人此时非常多余且无用。)

1 个答案:

答案 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
}

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