Собственные коллекции - все еще стоит дополнительной работы?

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

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

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

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

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

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

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

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сейчас в.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” );

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

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

Другие вопросы по тегам