Встраивание в Java

Вы можете отключить подсветку ячейки таблицы, используя следующий код в (iOS) Xcode 9, Swift 4.0

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}
36
задан jonrsharpe 18 February 2015 в 21:48
поделиться

7 ответов

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

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

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

52
ответ дан 27 November 2019 в 05:44
поделиться

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

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

6
ответ дан 27 November 2019 в 05:44
поделиться

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

В Java такого нет, компилятор (а позже и виртуальная машина при выполнении оптимизации) может решить «встроить» метод.

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

5
ответ дан 27 November 2019 в 05:44
поделиться

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

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

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

4
ответ дан 27 November 2019 в 05:44
поделиться
class A {
    final int foo() { return 3; }
}

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

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

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

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

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

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

2
ответ дан 27 November 2019 в 05:44
поделиться

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

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

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

1
ответ дан 27 November 2019 в 05:44
поделиться

Прочтите это, чтобы узнать о поведении встраивания. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++andjava.html

В нем говорится, что методы Final могут быть встроенными, но не всегда.

1
ответ дан 27 November 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: