Array, List, List<T>, ArrayList

Раздел, посвящённый самому важному - скорости.

Array, List, List<T>, ArrayList

Сообщение shadowagv 10 июл 2012, 15:40

Что лучше всего в плане оптимизации, типизированные коллекции, не типизированные, простые массивы?
Аватара пользователя
shadowagv
UNITрон
 
Сообщения: 173
Зарегистрирован: 09 сен 2011, 18:57
Откуда: Minsk
  • Сайт

Re: Array, List, List<T>, ArrayList

Сообщение seaman 10 июл 2012, 17:02

Простые массивы (из дотнета, не Юнити). Все остальное обычно реализуется ими же с дополнительными навесками.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Array, List, List<T>, ArrayList

Сообщение Woolf 10 июл 2012, 17:10

shadowagv писал(а):Что лучше всего в плане оптимизации, типизированные коллекции, не типизированные, простые массивы?


Я бы на вашем месте про массивы обычные вообще забыл бы. Они хоть и быстрее, но нифига не удобнее, более того, их использование ограничивает расширение кода и является одной из причин появления трудновылавливаемых ошибок. Я вижу только одно применение в игроделе для массивов - это задать некие табличные данные, к примеру, карту, или заранее просчитанный набор констант. Все остальное - списками. Даже если вы точно знаете, что, к примеру, у вас на карте будет ровно 10 игроков и ни одним больше - то все равно, лучше юзать список.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Array, List, List<T>, ArrayList

Сообщение Woolf 10 июл 2012, 17:12

seaman писал(а):Простые массивы (из дотнета, не Юнити). Все остальное обычно реализуется ими же с дополнительными навесками.


Ух ты, списки реализуются массивами? Вы прям мне глаза открыли )) А я думал, что списки реализуются методом динамичного выделения памяти и указателями..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Array, List, List<T>, ArrayList

Сообщение seaman 10 июл 2012, 19:23

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

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

Реализация списков последовательного хранения и ссылочная реализация есть тут

Т.о. видим что массивом можно реализовать оба способа хранения. Как это реализовано на самом деле в дотнете Вы можете посмотреть рефлектором, если действительно хотите что-то узнать. Реализовано там это именно массивами. Например Insert;
Синтаксис:
Используется csharp
public void Insert(int index, T item)
{
    if (index > this._size)
    {
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_ListInsert);
    }
    if (this._size == this._items.Length)
    {
        this.EnsureCapacity(this._size + 1);
    }
    if (index < this._size)
    {
        Array.Copy(this._items, index, this._items, index + 1, this._size - index);
    }
    this._items[index] = item;
    this._size++;
    this._version++;
}

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

Очень рад, что открыл Вам глаза.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Array, List, List<T>, ArrayList

Сообщение shadowagv 10 июл 2012, 20:04

На одной из конференций говорилось что линейные структуры быстрее, т.е. массивы быстрее списков
Значит лучше array
Аватара пользователя
shadowagv
UNITрон
 
Сообщения: 173
Зарегистрирован: 09 сен 2011, 18:57
Откуда: Minsk
  • Сайт

Re: Array, List, List<T>, ArrayList

Сообщение seaman 10 июл 2012, 21:04

Значит лучше array

Быстрее не значит лучше. В разных ситуациях по разному.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Array, List, List<T>, ArrayList

Сообщение Sp1tfire 17 июл 2012, 18:23

shadowagv писал(а):На одной из конференций говорилось что линейные структуры быстрее, т.е. массивы быстрее списков
Значит лучше array


вероятнее всего, списки с заданным параметром Capacity не будут уступать масивам.

т.е.
Синтаксис:
Используется csharp
const int capacity = 10;
List<int> il = new List<int>(capacity);
Sp1tfire
UNец
 
Сообщения: 4
Зарегистрирован: 09 дек 2011, 15:12

Re: Array, List, List<T>, ArrayList

Сообщение seaman 17 июл 2012, 23:37

Тут задается начальное значение. Если попытаетесь засунуть в список больше - он начнет расти. Но замедление в основном не от этого, а от дополнительных накладных расходов на переход от представления список <=> массив. Их то никуда не деть.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Array, List, List<T>, ArrayList

Сообщение Mikhail 26 июл 2012, 15:15

А кто-нить юзает Linq? Поддерживается ли он вообще на мобилках и вебе? Поделитесь опытом... Если не юзаете, то как ищете нужные элементы в списках, массивах?
Mikhail
UNец
 
Сообщения: 24
Зарегистрирован: 03 мар 2011, 11:57

Re: Array, List, List<T>, ArrayList

Сообщение pod4444 27 июл 2012, 02:37

Mikhail писал(а):А кто-нить юзает Linq? Поддерживается ли он вообще на мобилках и вебе? Поделитесь опытом... Если не юзаете, то как ищете нужные элементы в списках, массивах?

linq нет же в NET 2.0
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Array, List, List<T>, ArrayList

Сообщение seaman 27 июл 2012, 06:48

А при чем тут 2.0? Юнити поддерживает 3.5
Я не совсем уверен - не нашел подтверждение. Но недавно читал, что конструкций LINQ рантайм вообще нет. Все его конструкции преобразуются компилятором в стандартные на этапе компиляции. Так что не вижу причин, чтобы они не работали.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Оптимизация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4