Будет ли JVM когда-либо встраивать переменные и методы экземпляра объекта?

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

Бухгалтерский объект является закрытым и окончательным, и все его методы являются закрытыми, окончательными и @inline. Вот пример (в синтаксисе Scala):

object Frobnicate {
  private class DataRemaining(val start: Int, val end: Int) {
    @inline private def nextChunk = ....
  }

  def frobnicate {
    // ...
    val bookkeeper = new DataRemaining(0, 1000)
    while( bookeeper.hasData ) {
      val data = bookkeeper.nextChunk
      // ......
    }
  }
 }

Будет ли когда-нибудь JVM встраивать весь объект DataRemaining в Frobnicate.frobnicate? То есть будет ли он обрабатывать start и end как локальные переменные и встраивать код nextChunk непосредственно в frobnicate?


person Bill    schedule 02.06.2011    source источник


Ответы (1)


В Java он может встраивать поля и методы в ситуации, как у вас. Он не уничтожает Объект полностью, но приближается к нему. Я предполагаю, что Scala будет работать аналогично.

person Peter Lawrey    schedule 02.06.2011
comment
Поскольку это делается JIT-компилятором JVM, язык не имеет значения. Так что да, он встраивает эти методы. - person Kim Stebel; 02.06.2011
comment
@ Ким, единственная причина, по которой я не уверен, это то, как Scala преобразует код в байтовый код. Если он эффективен (а он должен быть), то проблем нет. Если он более динамичен, чем может показаться, это может запутать JIT. - person Peter Lawrey; 02.06.2011
comment
Scala не является динамическим языком, по крайней мере, не в том смысле, что для каждого вызова метода требуется поиск по карте... - person Kim Stebel; 02.06.2011
comment
Я предполагаю, что одна проблема заключается в том, что Scala val и var реализованы как виртуальные методы, поэтому это может ограничить возможность их встраивания JVM. - person Bill; 03.06.2011
comment
@Bill, JVM может встраивать виртуальные методы, если она может определить, что один или два из них используются чаще всего (и они короткие) - person Peter Lawrey; 03.06.2011
comment
Изменилось бы встраивание, если бы класс DataRemaining не был закрытым? Я просто думаю об эффективности шаблона Decorator. - person honzajde; 13.05.2014
comment
@ user271996 JVM оптимизируется на основе локального использования. Это означает, что если вы используете только один класс в выражении, тот факт, что классов может быть много, не имеет большого значения для производительности. - person Peter Lawrey; 13.05.2014
comment
В чем тогда разница между этим случаем с public и описанным здесь случаем: stackoverflow.com/questions/6115783/? - person honzajde; 13.05.2014
comment
@ user271996 в приведенном выше примере объект выделяется вне цикла. Если вы создаете объект внутри цикла, он не оптимизирует его. - person Peter Lawrey; 14.05.2014