Scala (или JVM) когда-нибудь оптимизируют (Function) объекты? - PullRequest
5 голосов
/ 25 февраля 2012

Во многих случаях со Scala, таких как простые локальные вызовы функций, можно представить, что часто теоретически можно вообще избавиться от объекта функции.Но AFAIK, JVM не знает, как это сделать, и я не думаю, что Scala тоже.Правильно?

Всегда ли закрыты объекты анонимных функций?Если нет, то есть довольно жесткое ограничение на то, как много можно сделать.Правильно?

Кто-нибудь знает о каких-либо запланированных усилиях, которые могут решить эти виды оптимизации?

См. Также связанный вопрос на чистом Java: Оптимизирует ли современная JVM простую встроенную функциюанонимное распределение классов?

(Воспевание "не оптимизировать слишком рано", "это не имеет значения" и т. д. очень избыточно на данный момент и бесполезно.)

1 Ответ

5 голосов
/ 25 февраля 2012

Анализ Inlining плюс Escape может сделать именно это. Вы можете продемонстрировать это себе, если используете отчеты о компиляции в 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
}

На моей машине второй, по крайней мере, такой же быстрый, как и первый (иногда быстрее), несмотря на то, что второй, похоже, требует создания функции каждую следующую итерацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...