Java - вес экземпляра - PullRequest
       1

Java - вес экземпляра

2 голосов
/ 27 февраля 2012

Скажем, у меня очень легкий объект:

public class Point {
  public int x;
  public int y;
  public Point(int ax, int ay){
    x = ax;
    y = ay;
  }
}

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

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

Ответы [ 4 ]

5 голосов
/ 27 февраля 2012

Лично я бы не беспокоился о том, чтобы создавать экземпляры этих объектов каждый раз, когда вам нужна точка. Хотя да, было бы немного быстрее кешировать несколько, я согласен, что это сделает код менее чистым. Посмотрите, что эта книга по оптимизации производительности Java говорит о затратах на создание объектов: https://www.safaribooksonline.com/library/view/java-performance-tuning/0596000154/ch04.html

В принципе, если старый Pentium II мог создавать миллион легких объектов в секунду, то я не думаю, что вам есть о чем беспокоиться, учитывая сегодняшние НАМНОГО более быстрые процессоры / память / и т. Д.

2 голосов
/ 27 февраля 2012

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

http://www.ibm.com/developerworks/java/library/j-jtp01274/index.html

Возможные оптимизации JVM, такие как те, которые указаны в следующей цитате, должны быть приняты во внимание.

Компилятор JIT может выполнять дополнительную оптимизацию, которая может снизить стоимость размещения объектов до нуля.

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

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

В общем, если вы не измеряете, что затраты на выделение ваших объектов Point занимают слишком много времени, вы не должны жертвовать качеством кода для его дальнейшего улучшения.

0 голосов
/ 27 февраля 2012

Обновление предыдущего экземпляра не будет выделять новую память, но создание нового экземпляра . Время от времени сборщик мусора jvm будет освобождать память. Вы не можете это контролировать. Поэтому всегда лучше обновить существующий экземпляр, если вы не храните историю.

Однако вы всегда можете использовать функцию установки.

public class Point {
  public int x;
  public int y;
  public Point(int ax, int ay){
   this.setXY(ax, ay);
  }
  public void setXY(int ax, int ay){]
    x = ax;
    y = ay;
  }
}
0 голосов
/ 27 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...