Различия в производительности между статическими и нестатическими конечными примитивными полями в Java - PullRequest
7 голосов
/ 01 октября 2010

Недавно я наткнулся на класс, в котором было объявлено следующее поле:

private final int period = 1000;

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

В частности:

1) Как хранятся конечные статические примитивы?Просто ли они скомпилированы непосредственно в выражения, в которых они используются?

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

3) Являются ли компиляторытеперь достаточно умен, чтобы определить, что в случаях, подобных приведенному выше, переменная «эффективно статична», так как было бы невозможно, чтобы разные экземпляры содержали разные значения и, следовательно, оптимизировали ее аналогично окончательному статическому?

1 Ответ

5 голосов
/ 01 октября 2010

1) Как хранятся конечные статические примитивы? Они просто скомпилированы непосредственно в выражения, в которых они используются?

Не скомпилировано непосредственно в выражения. Они скомпилированы в файл .class и на них ссылается код операции ldc.

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

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

3) Являются ли компиляторы достаточно умными, чтобы определить, что в таких случаях, как приведенный выше, переменная «эффективно статична», поскольку было бы невозможно, чтобы разные экземпляры содержали разные значения и, следовательно, оптимизировали ее аналогично конечному статическому

Не уверен, но я сомневаюсь, что он оптимизирован на уровне компилятора. JIT, вероятно, вступит в игру. Однако я совсем не уверен, каких «различий в производительности» вы ожидаете. Независимо от того, что происходит, влияние на производительность будет незначительным. (Статический / нестатический / Окончательный / неконечный)

...