Небольшие объекты: создавать часто или повторно? - PullRequest
0 голосов
/ 18 августа 2011

Например, в методе draw мне нужен экземпляр Rectangle. Как это:

Rectangle rect = new Rectangle(FrameSize * CurrentFrame, 0, FrameSize, FrameSize);

Или другим способом. Определите временный элемент данных прямоугольника, а затем используйте его следующим образом:

rect.X = FrameSize * CurrentFrame;
rect.Y = 0;
rect.Width = FrameSize;
rect.Height = FrameSize;

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

Ответы [ 6 ]

3 голосов
/ 18 августа 2011

Если вы не доказали тщательным измерением, что повторное использование улучшает вашу производительность, вы должны каждый раз создавать новый объект.

.NET обрабатывает создание объектов и GC очень эффективно, вам не следует беспокоиться о каком-либо падении производительности.Второе решение требует более тщательного кодирования, чтобы убедиться, что вы не используете повторно используемые объекты где-либо еще, и у вас нет предыдущего состояния.Еще больше у вас будет больше объектов, стареющих в gen1 или gen2 в GC.

3 голосов
/ 18 августа 2011

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

Сборщик мусора очень хорош в восстановлении недолговечных объектов- а создание новых объектов означает, что вам не нужно беспокоиться о том, что что-то все еще имеет ссылку на старый объект (таким образом, делая изменения в нем проблемой).

2 голосов
/ 18 августа 2011

Как долго живут объекты? Если они создаются только локально, а затем используются методами рисования, то, скорее всего, они будут собраны в нулевом поколении, что довольно эффективно.

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

Как правило, я бы остановился на # 1 и ТОЛЬКО рассмотрим # 2, если позже вы обнаружите, что # 1 стал проблемой.

1 голос
/ 18 августа 2011

Первый вариант безопаснее, когда речь идет о возможных ошибках, поскольку изменчивость класса Rectangle может привести к странным и трудно обнаруживаемым эффектам.

Я не думаю, что снижение производительности достаточно серьезно, чтобы рисковать рисковать в диком мире изменчивых структур.

0 голосов
/ 18 августа 2011

Я бы сделал это на индивидуальной основе. Вы не получаете много пользы от его повторного использования, и это делает ваш код легче взломать. Делая это на основе экземпляра, вы можете инкапсулировать некоторую логику в методе, и вам не придется беспокоиться о том, что она сломается из-за факторов вне метода.

0 голосов
/ 18 августа 2011

Рассмотрим тот факт, что структуры размещаются в стеке. В случае метода рисования я лично выбрал бы первый подход, как

  1. Объект создан и инициализирован

  2. Используется

  3. Отправляется в GC, когда мы покидаем функцию.

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

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