объект [] против списка <object>против IEnumerable <object> - PullRequest
0 голосов
/ 23 апреля 2011

У меня есть тонны объектов того же класса obj, в настоящее время определенные как obj[].

В большинстве случаев эти obj являются просто default(obj), не лучше ли было бы реализовать IEnumerable<obj> вместо этих obj[] списков?

Это должно освободить память для меня, верно? В настоящее время эти объекты (работают с профилировщиком памяти) имеют по 200 тыс. Элементов (постоянно растут).

Поможет ли мне изменить списки на IEnumerables?

Ответы [ 3 ]

1 голос
/ 23 апреля 2011

Фактическая реализация List<T> основана на массивах, поэтому разница в использовании памяти между ними будет незначительной.

Что касается IEnumerable<T>: нет, это не спасет вас. Элементы null или default вполне допустимы в IEnumerable<T>, и инфраструктура ничего не делает для фильтрации дубликатов. Этого не может быть, поскольку объем памяти, связанный со структурой IEnumerable<T>, полностью зависит от класса, который его реализует, и если вы просто добавляете массив в перечисляемую переменную или поле, вы ничего не меняете. Перечислимые значения также являются неизменяемыми, поэтому предложенное переключение, вероятно, будет серьезным изменением в реализации вашего массива.

Если вы не заботитесь о заказе, вы можете использовать HashSet<T>. Это на самом деле делает фильтрацию дубликатов, поэтому, если многие или большинство ваших элементов default(T), вам потребуется память только для одного из них. Очевидно, что это исключит все дубликаты, а не только дубликаты по умолчанию, поэтому этот выбор будет полезен, только если нет другого дублирования.

Если вам требуется изменяемая семантика - как я подозреваю, если вы используете массивы - тогда вы могли бы должны ) переключиться на изменяемый интерфейс, такой как IList<T> и напишите свою собственную реализацию - вероятно, основанную на List<T> - которая игнорирует default(T), когда вы пытаетесь добавить ее. Таким образом, вы можете сохранить порядок элементов, не являющихся default, даже не выделяя памяти для хранения элементов default.

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

1 голос
/ 23 апреля 2011

IEnumerable - это просто интерфейс;это не предписывает никакой способ хранения данных.List просто содержит массив, который увеличивается при добавлении в него большего количества элементов, но вы можете вызвать метод TrimExcess(), чтобы уменьшить массив.

0 голосов
/ 23 апреля 2011

Как сказал Марк, IEnumerable - это просто интерфейс. Object [] и List (и большинство других универсальных коллекций в .NET Framework) фактически реализуют интерфейс IEnumerable.

Более подходящим вопросом было бы, лучше ли Object [] или List или LinkedList и т. Д.

Массив объектов (т. Е. Object []) будет иметь наименьший объем памяти, поскольку список может быть в два раза больше объема памяти массива (в зависимости от количества элементов в списке). Когда вы добавляете элемент в список, а внутренний массив заполнен, он удваивает размер массива в попытке ускорить добавление новых элементов в среднем с алгоритмической точки зрения.

...