Подтвердить что ты не робот

Вложение в Java

В С++ я могу объявить метод "inline", и компилятор, скорее всего, встроит его. Насколько я понимаю, в Java нет такого ключевого слова.

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

4b9b3361

Ответ 1

Несколько других ответов предположили, что только окончательные методы могут быть встроены - это неверно, поскольку HotSpot достаточно умен, чтобы иметь возможность встроить не конечные методы, если они еще не были переопределены. Когда класс загружается, который переопределяет метод, он может отменить его оптимизацию. Очевидно, что окончательный метод означает, что никогда не требуется...

В принципе, пусть JVM выполняет свою работу - это, вероятно, будет намного лучше при разработке, где встроить, чем вы.

Есть ли у вас ситуация, когда вы уверены, что JVM не делает хорошую работу? Предполагая, что вы используете HotSpot, пытались ли вы использовать версию сервера вместо клиента? Это может иметь огромное значение.

Ответ 2

Хотя java-компилятор может делать inline (для кратких ранних меток), сильная вставка real будет выполняться компилятором JIT. Компилятор JIT (HotSpot) сможет даже встроить виртуальные методы. Лучший способ взаимодействия с ним - написать простой и сжатый код. Скорее всего, код, который использует Reflection, не позволит встраивать.

Надеюсь, что это поможет.

Ответ 3

'В С++ я могу объявить метод "inline", и компилятор будет встраивать его "... или нет. Компилятор может свободно использовать функцию inline или нет, и вы не можете повлиять на результат. Это всего лишь подсказка для компилятора.

В Java нет такой вещи, компилятор (и позже VM при выполнении оптимизации) может решить "встроить" метод.

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

Ответ 4

Встраивание более вероятно, если этот метод:

  • короткий
  • конечная
  • не зависит от каких-либо длинных, не окончательных методов

Поскольку это единственные обстоятельства, при которых JVM может быть уверен в эффектах вызова.

Ответ 5

class A {
    final int foo() { return 3; }
}

Учитывая этот класс, любой вызов функции foo() можно заменить константой "3". Любая виртуальная машина Java1 может это сделать, потому что ключевое слово final явно указывает, что невозможно иметь подкласс, который переопределяет "int foo()".

Вложение метода предоставляет следующие преимущества на сайте вызова:

  • Нет вызова метода
  • Динамическая отправка
  • Возможно постоянное сведение значения, например. "a.foo() + 2" становится 5 без кода, выполняемого на
    во время выполнения.

В прошлом программисты часто вставляли ключевое слово final именно по этой причине. Или, чтобы лучше облегчить встраивание и увеличить скорость выполнения, они объединили бы множество более мелких методов в один более крупный метод. Но во многих отношениях такие методы полностью уничтожают весь модуль модуляции и повторного использования, встроенный в язык программирования.

Современная JVM, такая как Java HotSpot VM, может встроить класс без final. Ключевое слово **.

(http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html)

Ответ 7

Да, если JVM решит это сделать, это возможно. Способы воздействия включают установку метода как статического или окончательного.

Конечно, самое важное в этом состоит в том, что структура метода должна быть дружественной. Short помогает, но, самое главное, ему нужно использовать только локальные переменные и его параметры, поля и минимальные вызовы методов другим методам в одном классе.

Однако вы не должны пытаться делать такую ​​оптимизацию преждевременно, вы действительно могли бы ухудшить ситуацию (потому что вы могли бы коротко замыкать другие потенциальные оптимизации). Иногда JVM понимает, что метод может быть встроен без этих подсказок.

Ответ 8

При сравнении нормальной функции и конечной функции (которая называется встроенной JVM), я видел, что между ними нет улучшения производительности. Возможно, накладные расходы на вызов функции уже очень низкие.

Примечание. Я использовал алгоритм размытия ящиков для оценки производительности.