Собственные коллекции - все еще стоит дополнительной работы? - PullRequest
3 голосов
/ 30 октября 2008

Извините, если я не согласен с моей терминологией, у меня всего около 2,4 лет опыта программирования, в основном на .NET.

В настоящее время я один из двух разработчиков .NET в магазине мэйнфреймов, другой разработчик устанавливает стандарты и является отличным программистом с гораздо большим опытом и степенью CS (я на 100% самоучка).

Мы используем настраиваемые коллекции для каждого приложения, недавно, начиная с .NET 2.0, я получил его, используя дженерики вместо ArrayLists, и производительность глазного яблока у них, кажется, отличная. Мы разработали автоматизированную программу, которая использует SQLDMO для подключения к базам данных и создаст базовый уровень данных и бизнес-уровни для любых объектов, которые нам нужны, плюс она обрабатывает логическое удаление и так далее.

Когда производительность - это то, для чего вы оптимизируете, когда вы можете оправдать НЕ использовать собственную коллекцию и писать для нее собственную сортировку? В настоящее время мы используем жестко закодированные сортировки, потому что все, что мы видели, намного медленнее, поскольку в большинстве других опций используются отражения или раздутые наборы данных / LINQ (это все еще медленнее, чем год назад по сравнению с пользовательскими коллекциями?).

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

Все мнения будут с благодарностью.

РЕДАКТИРОВАТЬ: Извините за терминологию, я знал, что я получу что-то немного. Под пользовательскими коллекциями я действительно имел в виду использование пользовательских классов и пользовательского класса коллекции, который наследует List (Of T), а также реализует IComparable для обработки сортировки.

Ответы [ 8 ]

4 голосов
/ 30 октября 2008

Я также использую общие списки или словари, но я часто делаю свои собственные классы, основанные на общих. Так что я могу определить class CustomerList : List<Customer>. Это позволяет мне добавлять пользовательские функции к классу, а также, если потребуется, легко заменить их на пользовательскую реализацию позже.

4 голосов
/ 30 октября 2008

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

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

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

Если вы используете ассоциативную коллекцию, такую ​​как Dictionary, вы должны также проверить, используете ли вы лучшую реализацию GetHashCode () для объектов в коллекции

Проблема с .Net (предостережение: я сам до сих пор использовал только .Net 2.0) состоит в том, что у них нет хорошего набора классов сбора, и их гарантии сложности не так широко известны, как они. должно быть.

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

Пока я не сталкивался со случаем, когда мне приходилось писать собственный класс коллекций из-за неэффективно выполняемых встроенных (или PowerCollection) коллекций (кроме более старых, предварительных общих версий). Я чувствую, что если, убедившись, что вы используете правильную сложность и профилируете, вы обнаружите, что они все еще недостаточно эффективны, то, возможно, .Net - не лучший выбор для вашего приложения. YMMV.

3 голосов
/ 30 октября 2008

Я бы предложил использовать стандартные коллекции дженериков на ранних этапах разработки. Если позже вы обнаружите узкое место в производительности, вы можете изменить дизайн с помощью собственных коллекций. Перефразируя Стива Макконнелла, автора Code Complete, люди, как известно, плохо оценивают производительность. Если вы не знаете наверняка, к какому количеству будет обращаться этот класс и его методы, это еще не стоит того, чтобы его опоментировать.

2 голосов
/ 30 октября 2008

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

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

Пользовательские коллекции были гораздо более распространены до появления Generics в 2.0

.
2 голосов
/ 30 октября 2008

Я всегда использую общие коллекции. Иногда я могу получить свой собственный класс коллекции из существующего универсального класса, чтобы добавить свои собственные методы и поведения, но он все еще является универсальным. Если бы производительность была такой большой проблемой, вы бы, вероятно, не использовали встроенные классы коллекций.

1 голос
/ 30 октября 2008

Сейчас в .net 3.5 я использую общие классы коллекций (List, Dictionary) и, если мне нужно добавить логику в эти коллекции, я использую методы расширения. Например:

public static class Extensions
{
   public static Customer GetCustomerByName( this List<Customer> customers )
  {
     …
    return customer;
  }
}

var customers = new List<Customer>();
customers.Add( new Customer());
var customer = customers.GetCustomerByName( “Smith” );
1 голос
/ 30 октября 2008

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

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

0 голосов
/ 04 мая 2010

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

Массив, словарь, коллекции - производительность, функциональность, надежность

...