Member 14056515 Ответов: 5

Какой из них лучше из arraylist и list<object> В C#


Может ли кто-нибудь помочь мне очистить эту тему, Какой из них лучше использовать между arrayList и List<object>

Что я уже пробовал:

Без сомнения, List< gt; лучше, но как быть в этом случае, то есть список объектов

5 Ответов

Рейтинг:
2

lmoelleb

Для объектов это технически не имеет значения.

ArrayList (и другие не универсальные списки) остаются в .NET, чтобы сохранить его обратную совместимость. Их бы там не было, если бы .NET с самого начала поддерживал дженерики.

Поэтому просто забудьте о существовании ArrayList, чтобы ваш список объектов использовал те же типы, что и все остальное. Это делает код немного более последовательным.


Member 14056515

Эй,
Без сомнения, List лучше, чем ArrayList с точки зрения производительности, но я особенно застрял в том, что List<object> и ArrayList<> будут одинаковыми, потому что arraylist также принимает объект в качестве значения
так что меня смущает то, какой из них лучше при работе с объектами

OriginalGriff

Почему вы думаете, что есть разница в производительности - см. Мой ответ Айдину и посмотрите на справочные источники; вы увидите, что код почти идентичен для этих двух!

Aydin Homay

Я не согласен с OriginalGriff, который я также упомянул в своем ответе, но скажу еще раз:
List<t> имеет более строгое и менее напряженное добавление, чем ArrayList, тогда List<t> предоставляет дополнительный интерфейс (IReadOnlyList<t>), которого нет у ArrayList. Add in ArrayList возвращает int, в то время как в List<t> ничего не возвращает, это само по себе является улучшением производительности, поскольку возврат значения из функции имеет накладные расходы стека.

OriginalGriff

Все не так просто.
IL, генерируемый из кода C#, основан на стеке, поэтому существует очень хороший шанс, что производительность IL для возврата значения и не возврата его будет одинаковой в любом случае. А машинный код, в который переводится IL, скорее всего, будет основан на Регистре, так что очень возможно, что возвращаемое значение будет удерживаться, манипулироваться и возвращаться в регистр в "реальном мире", отрицая любое преимущество!

Единственный способ определить, есть ли существенная разница в производительности, - это написать один и тот же код, используя две конструкции и выполняя одни и те же операции несколько миллионов раз и синхронизируя их.

ArrayList, вероятно, будет намного медленнее в реальном мире из - за дополнительных накладных расходов на проверку при приведении объектов обратно к удобному типу-но я бы не обязательно ставил на это деньги! :смеяться:

Aydin Homay

Во-первых, мы не можем говорить, основываясь на случайности или вероятности. Я не видел их IL и не знаю, так что как инженер я предпочитаю видеть сценарий worth case. Во-вторых, я изучил производительность List vs Array и некоторых других коллекций (не ArrayList, потому что это устаревшая коллекция и, скорее всего, она будет отброшена в какой-то момент времени .Net или, по крайней мере, мне было ясно, что будет медленным из-за сложности реализации, которую он имеет) результат моего исследования задокументирован по следующей ссылке:
https://www.codeproject.com/Articles/1258660/Large-Collections-in-Csharp-Managed-Code-Part-II
Я запустил несколько миллионов с несколькими итерациями и собрал среднее время выполнения.

Рейтинг:
2

Member 14056515

Большое спасибо
Очень ценю это


Richard Deeming

Если вы хотите ответить на комментарий, нажмите кнопку "ответить" рядом с комментарием. НЕ опубликуйте свой ответ как новое "решение".

Рейтинг:
0

OriginalGriff

List<T> это лучше, потому что он строго типизирован - что означает, что он содержит только те объекты, которые вы ожидаете, и вам не нужно их приводить, когда вы их используете.

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


Member 14056515

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

OriginalGriff

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

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

Aydin Homay

Но даже наличие списка объектов лучше, чем использование ArrayList из-за низких накладных расходов List<T>

OriginalGriff

Эм ... нет. Взгляните на справочные источники, и вы увидите, что это почти один и тот же код.
https://referencesource.microsoft.com/#mscorlib/system/collections/arraylist.cs,3e3f6715773d6643
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646

Aydin Homay

Именно после того, как я посмотрел, я написал это. ;-)
Я думаю пойти немного глубже с этими кодами

MadMyche

Скорее всего, нет. Любые накладные расходы, которые вы видите, будут зависеть от того, что вы пытаетесь с ними сделать. Поскольку вы не поделились контекстом вопроса, трудно показать вам, что лучше. Помните, что ArrayList, List и т. д.-Это все коллекции объектов.

Aydin Homay

List<t> имеет более строгое и менее напряженное добавление, чем ArrayList, тогда List<t> предоставляет дополнительный интерфейс (IReadOnlyList<t>), которого нет у ArrayList. Add in ArrayList возвращает int, в то время как в List<t> ничего не возвращает, это само по себе является улучшением производительности, поскольку возврат значения из функции имеет накладные расходы стека.

Рейтинг:
0

Aydin Homay

Привет,

Ответ на ваш вопрос немного сложен, потому что он зависит от типа объекта, длины коллекции и операций, которые необходимо выполнить с коллекцией, и даже от частоты этих операций. Но, чтобы получить хороший пейзаж о производительности коллекций В.Net я перенаправлю вас на мою статью, которая показывает вам результаты бенчмаркинга в этой области.

Большие коллекции в C# (управляемый код) - Часть II[^]

О только ArrayList vs List я должен упомянуть, что ArrayList принадлежит к тому времени, что.У Net не было общего списка<t>. Фактически, List<t> поддерживает хранение значений определенного типа без приведения к объекту или из него (никаких накладных расходов на бокс/распаковку). ArrayList просто хранит ссылки на объекты.

Но даже если вы не используете преимущества универсального списка и создаете список с конкретным типом объекта, все равно List<t> лучше, чем ArrayList, по нескольким причинам, таким как:
1 - низкие накладные расходы в методе Add. ArrayList имеет более дорогой метод Add из-за проверки Contract.Ensures()
2 - й List<T> реализует IReadOnlyList<T> а ArrayList не. Этот интефект очень полезен, когда вы хотите создать коллекцию только для чтения.
3 - я бы рекомендовал вам посмотреть реализацию каждого из них. список ArrayList против Список<t>

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

Овации,
АХ


Member 14056515

Эй,
Без сомнения, List лучше, чем ArrayList с точки зрения производительности, но я особенно застрял в том, что List<object> и ArrayList<> будут одинаковыми, потому что arraylist также принимает объект в качестве значения
так что меня смущает то, какой из них лучше при работе с объектами

Member 14056515

Надеюсь ты понимаешь о чем я говорю

Aydin Homay

Да, полностью понимаю, что я обновлю решение и, пожалуйста, прочтите новую часть.

lmoelleb

Насколько я знаю, вызовы классов контрактов кода удаляются компилятором. Таким образом, нет никакого штрафа за исполнение контракта.Гарантирует

Aydin Homay

Интересно, не могли бы вы предоставить мне ссылочную ссылку (от Microsoft), которая ссылается на то, что вы говорите?

lmoelleb

https://docs.microsoft.com/en-us/dotnet/framework/debug-trace-profile/code-contracts. Найдите CONTRACTS_FULL, который можно использовать для принудительной генерации вызовов, даже для сборок релизов.

Рейтинг:
0

Sk Imad

Список лучше, чем список массивов. Список - это интерфейс. Он расширяет непосредственно коллекцию.