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

Есть ли причина в производительности для объявления параметров метода final в Java?

Есть ли причина в производительности для объявления параметров метода final в Java?

Как в:

public void foo(int bar) { ... }

Versus:

public void foo(final int bar) { ... }

Предполагая, что bar читается и никогда не изменяется в foo().

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Если вы беспокоитесь о производительности, очень важно сделать некоторые профилирующие работы над вашим кодом и выяснить, что именно замедляет вас. Это почти наверняка не то, что вы ожидаете от него:)

Ответ 4

Компиляторы, которые работают после загрузки классов, такие как компиляторы JIT, могут использовать конечные методы. Следовательно, объявленные окончательные методы могут иметь некоторую выгоду от производительности.

http://www.javaperformancetuning.com/tips/final.shtml

Ох и еще один хороший ресурс

http://mindprod.com/jgloss/final.html

Ответ 5

Я бы посоветовал вам никогда не писать микро-тесты. Вы не знаете, какую оптимизацию может выполнять JIT и когда, и вы, вероятно, ошибетесь в том, как она себя ведет, просто делая "простой тестовый пример"

Ответ 6

Еще один момент, который выше, что использование не конечных локальных переменных, объявленных внутри метода, - внутренний экземпляр класса может пережить фрейм стека, поэтому локальная переменная может исчезнуть, пока внутренний объект все еще жив.

Ответ 7

final параметры только для чтения (означает идентификатор объекта, а не его состояние).

Ответ 8

Я предполагаю, что компилятор может удалить все частные статические конечные переменные с примитивным типом, такие как int, и встроить их непосредственно в код, как с помощью макроса С++.

Однако я не знаю, если это делается на практике, но это может быть сделано для сохранения некоторой памяти.