2015-01-05 1 views
0

Я хотел бы знать, может ли копирование переменной-члена в локальную переменную стека в каждом из методов объекта вызвать удар производительности?В Java частое копирование ссылок (копирование в локальные переменные стека вместо использования фактической переменной-члена) приводит к поражению производительности?

class X { 
    Another instanceOfAnother; 

    void foo() { 

     Another local = instanceOfAnother; //Would like to know if this causes a performance hit 
             //with regards to any garbage collection 
             //infrastructure 

    } 
} 
+1

JIT оптимизирует, утверждая. – bmargulies

ответ

1

Ссылки на объекты - это всего лишь значения, например int. (Я думаю, что они имеют тот же размер, что и int, но не цитируют меня. [Я не думаю, что спецификация JLS или VM говорит, но this answer утверждает, что они 32 бит на 32-битных процессорах и 64 бит на 64-битных процессорах.]) Java управляет локальными переменными, используя стек, и поэтому довольно эффективен с ними. Если вы не будете беспокоиться о копировании int или long от переменной к переменной, я бы не стал беспокоиться о копировании ссылки на объект из переменной в переменную.

1

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

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

Чтение локальной переменной означает просмотр соответствующей записи в локальной таблице переменных в стеке.

+0

Мне было интересно посмотреть, не приведет ли копирование ссылки к чему-то вроде CardSpace (я понимаю, что обновления для переменных-членов приводят к обновлению в CardSpace) –

+0

@SwamiPR Что вы подразумеваете под CardSpace? –

+0

Плохо, я имел в виду карточный стол. –

0

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

Не беспокойтесь о GC, единственное, что изменится в процессе сбора мусора, это то, что есть дополнительная ссылка на объект, поэтому, если вы скажете: instanceOfAnother = null;, а local все еще указывает на объект GC еще не сможет удалить объект, поскольку на нем все еще есть ссылка (local).

Но все это на таком низком уровне и малом масштабе, что вам не нужно беспокоиться об этом, если вам не нужно всевозможное увеличение производительности, которое вы можете получить из своей системы. Но в таком сценарии вы, возможно, должны смотреть на родные языки, такие как C++ вместо Java.

Смежные вопросы