Сравнение общего списка с массивом

Почему generic.list медленнее, чем массив?


person Community    schedule 06.11.2008    source источник
comment
грамматика? Ваш вопрос как таковой едва ли можно понять.   -  person Joel Coehoorn    schedule 06.11.2008
comment
Наверное, нужно дать расслабиться тем, кто не говорит по-английски.   -  person Lance Roberts    schedule 06.11.2008
comment
Как еще можно улучшить английский, если им никто не скажет, когда он особенно плох?   -  person Joel Coehoorn    schedule 06.11.2008
comment
Хороший момент, я думаю, что редактирование вопроса для удобства чтения, вероятно, поможет больше всего.   -  person Lance Roberts    schedule 06.11.2008
comment
Дать расслабиться? Для использования Y? Ну давай же.   -  person Alan    schedule 06.11.2008
comment
для справки: был по крайней мере один голос против, но это был не я.   -  person Joel Coehoorn    schedule 06.11.2008
comment
@Joel: я тоже :) В конце концов, это сайт программирования. Тем не менее, моя готовность терпеть нулевые усилия, ожидая, что другие ответят на 100%, намного ниже, чем раньше ...   -  person Alan    schedule 06.11.2008
comment
Было бы здорово, если бы вы определяли медленнее. Существует слишком много операций, которые можно выполнить как со списком, так и с массивом, чтобы мы могли интерпретировать то, что вы имеете в виду под словом «медленнее».   -  person JaredPar    schedule 06.11.2008
comment
@ Джоэл, я научился никогда не предполагать, кто голосовал каким образом, так как меня обвиняли в отрицательном голосовании, хотя я тоже этого не делал (хотя я и поддержал твой ответ).   -  person Lance Roberts    schedule 06.11.2008
comment
1. В .NET нет объекта с именем generic.list. Может вы имели в виду Список ‹T›? 2. Какую операцию вы пытаетесь сделать? 3. Какие измерения вы выполнили, чтобы прийти к своему заключению?   -  person Jay Bazuzi    schedule 06.11.2008


Ответы (2)


Общий список немного медленнее, чем массив, но в большинстве случаев вы этого не заметите. В основном это связано с более сложным поиском: говорят, что List использует массив «под капотом», но не гарантируется, что узлы в соседней памяти будут храниться так же, как в массиве.

Однако я видел несколько тестов еще в 2005 году (сейчас не могу найти ссылку), и разница очень невелика.

Кроме того, список имеет ряд важных преимуществ по сравнению с массивом: в основном это тривиальное добавление или удаление элементов. Гораздо проще использовать список, если вы не знаете, сколько элементов вам понадобится или когда это количество будет отличаться. В таких случаях (и, честно говоря, большую часть времени) вам, вероятно, не следует не использовать массив.

person Joel Coehoorn    schedule 06.11.2008
comment
хороший ответ, раз у вас достаточно очков, возможно, вы могли бы отредактировать вопрос. - person Lance Roberts; 06.11.2008
comment
Я не совсем понимал, каково было первоначальное значение. Да, я знаю, что это кажется странным, поскольку я дал ответ, но предоставление потенциально неправильного ответа не уничтожит вопрос, как это сделало бы редактирование. - person Joel Coehoorn; 06.11.2008
comment
Что ж, основной блок данных (массив) будет просто непрерывным, но согласен: он, вероятно, не является смежным с экземпляром List ‹T›. - person Marc Gravell; 07.11.2008

Что касается производительности чтения, есть два фактора:

  • дополнительное разыменование (т.е. List<T> будет содержать поле T[] и должно разыменовать его)
  • он не может использовать некоторые оптимизации компилятора, которые существуют для T[] - например, устранение проверки границ во время циклов

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

person Marc Gravell    schedule 06.11.2008