Почему создание класса final ускоряет процесс?

Возможный дубликат:
Зачем определять класс как final улучшает производительность JVM?

У меня есть следующий класс в моем проекте:

public final class LinkNode
{
  public int value;
  public LinkNode next;

  public LinkNode(int value, LinkNode next)
  {
    this.value = value;
    this.next = next;
  }

  public LinkNode(int value)
  {
    this(value, null);
  }
}

Самая медленная строка в моем коде (который в целом довольно сложный) — это место, где я создаю новые LinkNode.

Я обнаружил, что когда я создал класс final, код работал значительно быстрее. Это почему?

Есть ли что-нибудь еще, что я могу сделать в этом классе, чтобы оптимизировать этот класс, особенно основной конструктор?

(Например, являются ли геттеры/сеттеры быстрее, чем общедоступные поля? Могу ли я добавить другие модификаторы? И т. д.)


person dsg    schedule 19.01.2012    source источник
comment
Пожалуйста. покажите результаты сравнительного анализа, которые вы сравнили.   -  person Azodious    schedule 19.01.2012
comment
О, я нашел связанный вопрос: stackoverflow.com/questions/3961881/   -  person dsg    schedule 19.01.2012
comment
Вы уверены, что это существенно влияет на скорость?   -  person anubhava    schedule 19.01.2012
comment
это не связано. это точный ответ, который вам нужен. правильно? :-)   -  person Azodious    schedule 19.01.2012


Ответы (2)


Я обнаружил, что когда я сделал класс final, код работал значительно быстрее. Это почему?

Я думаю, это потому, что в вашей методологии бенчмаркинга есть изъян.

Предполагая, что вы используете недавнюю JRE Hotspot, JIT-компилятор достаточно умен, чтобы модификатор final в классе не должен был влиять на производительность... если только вы фактически не используете подкласс класса в своем приложении.

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

person Stephen C    schedule 19.01.2012

Объявление класса final напрямую влияет на производительность JVM. Окончательные классы и методы могут быть встроены после загрузки в JVM, потому что в этот момент JVM точно знает, что метод является окончательным. Поэтому может быть улучшение производительности JIT-компиляторов Java.

Вы можете проверить приведенные здесь ссылки для получения более подробной информации: http://www.javaperformancetuning.com/tips/final.shtml

person Korhan Ozturk    schedule 19.01.2012
comment
JIT в любом случае будет встраивать методы и при необходимости деоптимизировать их. Я придерживаюсь объяснения Стивена: ошибочный тест. - person Voo; 20.01.2012
comment
Я бы не стал полагаться на информацию на связанной странице. 1) Везде говорится, что мог бы и был бы, а это означает, что автор излагает теории, а не факты. 2) Нет ссылок на бенчмарки или окончательные источники. 3) Нет даже упоминаний о конкретных версиях/выпусках Java, а то, что от этого зависит реальная производительность - известный факт. - person Stephen C; 20.01.2012