Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы? / 13 сообщений из 13, страница 1 из 1
30.11.2012, 11:46
    #38059452
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
Например, всякие ToList, ToArray, AsEnumerable, AsQuerable. Они что, создают копию исходной последовательности, или просто добавляют-отрезают исходной последовательности функциональность (как-нибудь), не копируя все её члены в новую последовательность?

А то натыкаюсь на всякие рекомендации в спорах типа "List VS Array" - "я везде передаю между функциями массивы, а в самих функциях использую списки". Якобы, в общем и целом массив на сколько-то там процентов более производителен, чем список. Ну и ещё непонятно, если списки от массивов почти не отличаются, то зачем нужны массивы? Почему бы везде не использовать списки? Ведь к их элементам тоже можно обращаться с помощью индексатора, можно задать им жёстко ограниченную длину, послав в конструктор параметр count. Есть даже подозрение, что список внутри себя использует обыкновенный массив.

Понаделали, понимаешь, всяких коллекций - вот теперь мучаюсь проблемой выбора. А не было бы выбора и был бы один список - я бы таких вопросов не задавал.
...
Рейтинг: 0 / 0
30.11.2012, 12:12
    #38059501
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
user7320,

ToList, ToArray - создают новые список, массив и копируют туда свои элементы.
AsEnumerable, AsQuerable - создают новые обертки либо просто возвращают аргумент.

Массив неизменяемый объект, а список можно добавлять-удалять элементы. для последнего возможны тяжелые операции по копированию элементов при увеличении размера.
...
Рейтинг: 0 / 0
30.11.2012, 12:43
    #38059565
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
Списки, коллекции и пр. меняют размер с неким шагом ну типа +32.
А массив в приципе это фиксированный объект.
И все что имеет некий нумератор это по сути массив.
...
Рейтинг: 0 / 0
30.11.2012, 12:50
    #38059581
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
user7320,

если работаете с набором структрур , то массив может и предпочтительнее. в частности int[].
ну а если работать со объектами, то по скорости монопенисуально.
но в целом Лист будет по скорости и прожорливости проигрывать массиву.
смотря что вам надо , то и используйте. массивы и коллекции нужны для несколько разных задач.
вам же предоставляется выбор.
...
Рейтинг: 0 / 0
30.11.2012, 14:35
    #38059820
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
beg-in-erно в целом Лист будет по скорости и прожорливости проигрывать массиву.
Почему?

Вот, скажем, операция взятия элемента по иднексу - одинаково по скорости выполняется, что для списка, что для массива?

Последовательный проход по всем элементам массива через foreach - тоже одинаково?

По прожорливости проигрывает - ну, я могу понять, что у него есть дополнительное поле Capacity, да. Ну, ещё функций дополнительных немного, которые, кстати, места не занимают.

И вообще, есть ли что-то типа сводной таблицы производительности (в нотации "о" большое, например) всех типов коллекций Дотнетфреймворка для операций типа Add, Insert, Remove, Take, Sort, Find, Enqueue, Dequeue, Pop и т. п.? Желательно из официальных источников - от самих создателей фреймворка. Почему сами создатели фреймворка не делают таких тестов и сводных таблиц? Это же очень важно!

Иногда нахожу в нижках подобные таблицы или в Интернете, например http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Но либо там не все операции, либо устаревшие сведения (не все коллекции).
...
Рейтинг: 0 / 0
30.11.2012, 14:44
    #38059832
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
user7320beg-in-erно в целом Лист будет по скорости и прожорливости проигрывать массиву.
Почему?

ну потому что там принцип построения как бэ разный.
для того , что бы понять , надо лезть в термины обычной, т.е. "не управляемой" памяти.
"массив" это непрерывный (в разумных пределах) кусок памяти в куче, либо с самими значениями ( типа структура, int...., короче набор байт ), либо с указателями на объекты.
"список" это НЕ непрерывный, рваный.
движение по прямой в массиве всегда быстрее прыжков , которые совершает список. ну это если в кратце , очень общими мазками.
вам то оно зачем? насколько в вашей задаче настолько важна скорость, что вам нужен именно массив?
а то мож вам и списочек подойдёт ))
...
Рейтинг: 0 / 0
30.11.2012, 16:26
    #38060102
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
beg-in-er,

да, насчёт рваной и непрерывной кучи - это логичное объяснение разности в скорости. Но по идее, если в массиве адрес следующего элемента получается просто добавлением к адресу текущего шага размером в длину хранящихся в массиве элементов, то в списке к этому добавляется всего лишь сдвиг в памяти на следующий "расширяющий блок" (было Capacity 16, стало 32 - т. е. заранее зарезервировалась память на 16 элементов в другом месте, и только добавилась переменная, отвечающая за сдвиг предыдущего блока в Capacity относительно сделующего). Ну, это по моим дилетантским понятиям (хотя массивы в С++ изучал когда-то).

Ну, да ладно. Я понял, что есть некие накладные расходы у списка по отношению к массиву и как они могут образовываться. А где всё же узнать про производительность в терминах "О" большое по всем коллекциям и их операциям по всем версиям Дотнетфреймворка? Или хотя бы для 4 и 4.5. Или это своего рода коммерческая тайна - как говорят на презентациях Майкрософт, "используйте наши продукты - всё будет хорошо".
...
Рейтинг: 0 / 0
30.11.2012, 17:23
    #38060255
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
user7320,

вообще интересно устройство. Наверное в обычном массиве [] элемент получается сдвигом указателя на 0 эелемнт + Х, а в LIST еще хранится указатель на следующий а может и предыдущий элемент. Или я херню написал?))
...
Рейтинг: 0 / 0
30.11.2012, 17:49
    #38060339
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
beg-in-er"список" это НЕ непрерывный, рваный.

В .Net большая часть списков для хранения данных используют массивы - непрерывные области в памяти.
fortibransa Списки, коллекции и пр. меняют размер с неким шагом ну типа +32.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void EnsureCapacity(int min)
{
    if (this._items.Length < min)
    {
        int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
        if (num < min)
        {
            num = min;
        }
        this.Capacity = num;
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public void set_Capacity(int value)
{
    if (value < this._size)
    {
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity);
    }
    if (value != this._items.Length)
    {
        if (value > 0)
        {
            T[] destinationArray = new T[value];
            if (this._size > 0)
            {
                Array.Copy(this._items, 0, destinationArray, 0, this._size);
            }
            this._items = destinationArray;
        }
        else
        {
            this._items = List<T>._emptyArray;
        }
    }
}
...
Рейтинг: 0 / 0
30.11.2012, 18:00
    #38060369
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
ЕвгенийВbeg-in-er"список" это НЕ непрерывный, рваный.

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

тота у меня при переходе со списков int на массив int ( в одной конкретной задаче ) скорость выросла в 10 раз.

в любом случае скорость зависит от задачи. можно так всё сделать , что разницы не будет видно.
...
Рейтинг: 0 / 0
30.11.2012, 18:55
    #38060455
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
beg-in-er,

мне кажется все просто - если заранее известно число элементов, то массив []. Если нужна динамика, то коллекция.
ЗЫ Что же у вас были за объемы, что вы разницу почувствовали?
...
Рейтинг: 0 / 0
30.11.2012, 19:47
    #38060526
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
Все виды листов (и даже StringBuilder) являются обёртками над массивами. Если массива перестаёт хватать - то выделяется новый массив, и в него копируются данные из предыдущего.
Именно для этого в List и StringBuider есть конструктор, принимающий начальное значение элементов в массиве. Потери в производительности как раз и возникают из-за выделения и копирования.

Сказки про "рваную кучу" читайте детям на ночь.
...
Рейтинг: 0 / 0
13.12.2012, 15:59
    #38078031
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]