Javac или Hotspot автоматически добавляют 'final' в качестве оптимизации инвариантных переменных? - PullRequest
5 голосов
/ 05 апреля 2011

Похоже, консенсус заключается в том, что производительность помечает переменные-члены как окончательные, потому что они никогда не нуждаются в перезагрузке из основной памяти.Мой вопрос заключается в том, делают ли javac или Hotspot автоматически это для меня, когда очевидно, что переменная не может измениться.например, сделает ли javac 'x' final в этом классе ниже ...

public class MyClass {
   private String x;

   MyClass(String x) {
      this.x = x;
   }

   public String getX() {
      return x;
   }
}

По второму вопросу кто-нибудь представил эмпирическое доказательство того, что пометка элементов в качестве final делает код более быстрым?Любая выгода, безусловно, незначительна в любом приложении, выполняющем удаленные вызовы или поиск в базе данных?

Ответы [ 4 ]

4 голосов
/ 05 апреля 2011

Как и многие «улучшения» производительности, обычно лучше спросить;Что легче понять и рассуждать?например, если поле является окончательным, я знаю, что оно нигде не будет изменено.Это часто приводит к более оптимистичному коду, но что более важно, это должен быть более понятный код.;)

Конечно, я делаю любое поле, которое может быть окончательным, как окончательное.Лично я предпочел бы, чтобы final было поведением по умолчанию, и вы должны были использовать ключевое слово типа var, чтобы сделать его изменчивым.

2 голосов
/ 05 апреля 2011

Разрешение javac сделать это было бы ошибкой.Поскольку может быть код в другом jar-файле, который может полагаться на компилируемый код (модульность), изменение кода во время компиляции для оптимизации не является возможным вариантом.

Что касается второго аргумента «никогда не нужно перезагружаться из основной памяти», нужно помнить, что большинство переменных экземпляра кэшируются. final только указывает на неизменность, но не гарантирует изменчивость (volatile == всегда получать последние из основной памяти).Отсюда необходимость блокировок и изменчивого ключевого слова в многопоточной среде.

Что касается случая с горячей точкой, я понятия не имею, и хотел бы услышать больше об этом. final константы могут быть встроены во время компиляции, что обеспечивает умеренный прирост производительности.Ссылка на вопрос о встраивании в java

Редактировать:

Обратите внимание, что final означает, что неизменность должна быть взята с зерном соли,Это не гарантирует, что состояние не может измениться, оно только указывает, что ссылка на объект может быть изменена. final указывает неизменность для примитивных типов данных
1 голос
/ 05 апреля 2011

AFAIK, их нет, и, таким образом, вы несете незначительное наказание. Однако это можно сделать автоматически с помощью таких инструментов IDE, как Eclipse «Очистка».

0 голосов
/ 05 апреля 2011

Я полагаю, что современная JVM (компилятор Hotspot) обнаруживает, что значение не меняется, поэтому нет никакого выигрыша в производительности при создании параметров или переменных final самостоятельно , (Если это не так, предоставьте ссылку или контрольный пример.) Есть одно исключение: константы (static final).

Однако, это может отличаться от финальных методов и классов . Это может улучшить производительность в этом случае (я не совсем уверен, в каких случаях). Кстати, что немного повышает производительность, так это делает функции статичными (если это возможно).

Проблема, с которой я столкнулся с final, заключается в том, что она загромождает код. Было бы хорошо, если бы по умолчанию было установлено значение final.

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