#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 должна это оптимизировать. Если вас беспокоит производительность или память, то вам следует выполнить нагрузочный тест и профилировать свое приложение. Скорее всего, вы обнаружите проблему в другом месте, я действительно не стал бы слишком беспокоиться об этой части.