2010-04-22 12 views
3

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

Например, я видел DAL, который может быть выполнен со статическими классами, но они решили сделать его экземпляром в BLL при каждом вызове, который они называют чем-то вроде.

новый клиент(). GetData();

, как далеко это может быть плохо?

Благодаря

ответ

3

Казнь за исполнение должна быть незначительной. В this blog entry кто-то сделал короткий тест, в результате чего создание 500 000 объектов и добавление их в список стоило около 1,5 секунд.

Итак, поскольку я думаю, что new Customer().GetData(); будет называться не более несколько сотен раз в одной функции BLL, штраф за исполнение может быть проигнорирован.

В качестве примечания, либо дизайн или называние класса нарушается, если new Customer().GetData(); фактически используется: Если класс Customer только предоставляет средства, чтобы получить данные, следует назвать что-то другое, как CustomerReader (из-за отсутствия лучшего имени). С другой стороны, если Customer имеет состояние экземпляра, которое фактически представляет Заказчика, GetData должно быть статическим - не по соображениям производительности, а по соображениям последовательности.

0

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

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

В качестве побочного примечания - new Customer().GetData(); - подходящее место для размещения такого кода является сомнительным - мне кажется, что возвращенные данные напрямую связаны с экземпляром клиента на основе этого и фактически не вызов базы данных для извлечения данных.