Java = средство получения / установки = Увеличивает ли это «размер объекта» во время выполнения и время доступа (циклы процессора?)

#java #performance

#java #Производительность

Вопрос:

мне нужно написать ajax-приложение, где на стороне сервера (реализованное на Java) будут созданы и сохранены в памяти миллионы небольших объектов. обычно я использую beanstyle (с getter / setter) для любых объектов.

Мой вопрос: имеет ли значение (в отношении использования памяти и времени процессора для доступа) во время выполнения наличие методов получения / установки для созданного объекта по сравнению с их отсутствием и прямым доступом к полям / элементам? Например, если наличие средства получения / установки увеличивает размер объекта на 5 байт для каждого метода и экземпляра, то в сумме это значительно увеличит количество миллионов объектов ob. То же самое с доступом к получателю, который напрямую обращается к элементу / переменной в отношении циклов процессора.

 public String myvartoaccess;

vs

private String myvartoaccces;
public String getMyvartoaccess();
  

Большое спасибо!
Дженс

Ответ №1:

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

Что касается накладных расходов процессора, то они будут небольшими; однако они должны быть оптимизированы и незначительны.

Комментарии:

1. Да, lacqui верен. Реальная ценность обеспечивается различными библиотеками и инструментами, которые обращаются к этим полям с помощью этого средства получения / установки.

2. JVM, скорее всего, будет использовать встроенные простые средства получения, таким образом, не будет никаких накладных расходов процессора.

Ответ №2:

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

Ответ №3:

Средства получения и установки не влияют на использование памяти. Хранятся реализации метода getter / setter, Class из которых существует только один (в данном classloader). Экземпляры хранят только состояние объекта.

Что касается производительности, я сомневаюсь, что вызов простых средств получения / установки был бы значительно медленнее. Я бы определенно сначала внедрил с помощью средств получения и установки, а затем, если вы обнаружите, что это слишком медленно, вы могли бы потенциально покончить с ними. В конце концов, преждевременная оптимизация — корень всего зла.

Комментарии:

1. Немного поздно подходить к этому: но эта «преждевременная оптимизация, являющаяся корнем всего зла», вводит в заблуждение. Я бы сказал, что преждевременное использование методов для доступа к простым полям является преждевременным усложнением. Игнорирование эффективности на ранней стадии проектирования плохо, поскольку перепроектирование и последующие усилия могут быть непомерными. Это одно из тех высказываний, которые звучат хорошо, но имеют мало практической ценности: худшее из них — старая байка о том, что лучше сделать это правильно с первого раза, чем использовать отладчик позже…. Программист, которому не нужен отладчик, действительно очень особенный на современных кодовых базах.

Ответ №4:

Методы получения и установки не должны увеличивать объекты, только класс, который представляет эти объекты. Вряд ли наличие методов getter и setter будет иметь значение для вашей производительности, тем более что JVM должна это оптимизировать. Если вас беспокоит производительность или память, то вам следует выполнить нагрузочный тест и профилировать свое приложение. Скорее всего, вы обнаружите проблему в другом месте, я действительно не стал бы слишком беспокоиться об этой части.