Будут ли все работать быстрее, если я сделаю свои переменные окончательными?

Я пишу для Android (Java).

Я объявляю int и float как часть текущего цикла.

Некоторые из них не должны быть изменены после объявления.

Если я объявляю их окончательными при объявлении, все будет работать быстрее?

[изменить]

Спасибо всем. Я на самом деле не ожидал, что он внесет какие-либо улучшения, я просто заметил, что после просмотра источника различных крупных проектов это было довольно распространено. Приветствия

Ответ 1

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


Если бы это было на самом деле static final, тогда вы могли бы воспользоваться вычислением compiletime и вложением значения в любом refernce. Итак, например:

private static final long ONE_WEEK_IN_MILLIS = 7 * 24 * 60 * 60 * 1000L;

public void foo(Date date) {
    if (date.getTiem() > System.currentTimeMillis() + ONE_WEEK_IN_MILLIS) {
        // No idea what to do here?
    }
}

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

private static final long ONE_WEEK_IN_MILLIS = 604800000L;

public void foo(Date date) {
    if (date.getTiem() > System.currentTimeMillis() + 604800000L) {
        // No idea what to do here?
    }
}

Если вы запустите декомпилятор, вы сами увидите его.

Ответ 2

Хотя настройка на конечный может повлиять на скорость, ответ, вероятно, будет отличаться для каждой виртуальной машины или устройства.

Объявление их окончательным, однако, не больно, и можно даже назвать его хорошим стилем программирования.

Что касается производительности, это выглядит почти наверняка как преждевременная оптимизация. Профиль, найдите узкие места, переосмыслите свои алгоритмы. Не тратьте свое время на "окончательный" только из-за производительности - он едва ли разрешит любую проблему.

Ответ 3

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

http://docs.sun.com/app/docs/doc/819-3681/6n5srlhjs?a=view

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

Объявить аргументы метода final, если они не изменены в методе. В общем случае объявите все переменные окончательными, если они не изменены после инициализации или установлены на какое-либо значение.

Так, например, если у вас есть код, который умножает две из ваших конечных переменных, во время выполнения VM может использовать то, что обычно является сном/временем простоя, чтобы вычислить результат этого умножения, чтобы он не делал этого в периоды занятости.

Ответ 4

Я считаю хорошей практикой сделать переменные окончательными (вы можете использовать Eclipse Preferences > Java > Code Style > Clean Up для этого). Хотя производительность может действительно улучшиться, я ожидаю, что различия будут незначительными. На мой взгляд, это помогает с читабельностью кода, хотя (т.е. Не нужно искать назначения), что, безусловно, является хорошей вещью (tm).

Ответ 5

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

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

они оптимизируются с помощью JVM, хранятся в пуле констант с классом " http://negev.wordpress.com/java-memory-brief/"