|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
Например, всякие ToList, ToArray, AsEnumerable, AsQuerable. Они что, создают копию исходной последовательности, или просто добавляют-отрезают исходной последовательности функциональность (как-нибудь), не копируя все её члены в новую последовательность? А то натыкаюсь на всякие рекомендации в спорах типа "List VS Array" - "я везде передаю между функциями массивы, а в самих функциях использую списки". Якобы, в общем и целом массив на сколько-то там процентов более производителен, чем список. Ну и ещё непонятно, если списки от массивов почти не отличаются, то зачем нужны массивы? Почему бы везде не использовать списки? Ведь к их элементам тоже можно обращаться с помощью индексатора, можно задать им жёстко ограниченную длину, послав в конструктор параметр count. Есть даже подозрение, что список внутри себя использует обыкновенный массив. Понаделали, понимаешь, всяких коллекций - вот теперь мучаюсь проблемой выбора. А не было бы выбора и был бы один список - я бы таких вопросов не задавал. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 11:46 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
user7320, ToList, ToArray - создают новые список, массив и копируют туда свои элементы. AsEnumerable, AsQuerable - создают новые обертки либо просто возвращают аргумент. Массив неизменяемый объект, а список можно добавлять-удалять элементы. для последнего возможны тяжелые операции по копированию элементов при увеличении размера. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 12:12 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
Списки, коллекции и пр. меняют размер с неким шагом ну типа +32. А массив в приципе это фиксированный объект. И все что имеет некий нумератор это по сути массив. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 12:43 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
user7320, если работаете с набором структрур , то массив может и предпочтительнее. в частности int[]. ну а если работать со объектами, то по скорости монопенисуально. но в целом Лист будет по скорости и прожорливости проигрывать массиву. смотря что вам надо , то и используйте. массивы и коллекции нужны для несколько разных задач. вам же предоставляется выбор. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 12:50 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
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 Но либо там не все операции, либо устаревшие сведения (не все коллекции). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:35 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
user7320beg-in-erно в целом Лист будет по скорости и прожорливости проигрывать массиву. Почему? ну потому что там принцип построения как бэ разный. для того , что бы понять , надо лезть в термины обычной, т.е. "не управляемой" памяти. "массив" это непрерывный (в разумных пределах) кусок памяти в куче, либо с самими значениями ( типа структура, int...., короче набор байт ), либо с указателями на объекты. "список" это НЕ непрерывный, рваный. движение по прямой в массиве всегда быстрее прыжков , которые совершает список. ну это если в кратце , очень общими мазками. вам то оно зачем? насколько в вашей задаче настолько важна скорость, что вам нужен именно массив? а то мож вам и списочек подойдёт )) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:44 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
beg-in-er, да, насчёт рваной и непрерывной кучи - это логичное объяснение разности в скорости. Но по идее, если в массиве адрес следующего элемента получается просто добавлением к адресу текущего шага размером в длину хранящихся в массиве элементов, то в списке к этому добавляется всего лишь сдвиг в памяти на следующий "расширяющий блок" (было Capacity 16, стало 32 - т. е. заранее зарезервировалась память на 16 элементов в другом месте, и только добавилась переменная, отвечающая за сдвиг предыдущего блока в Capacity относительно сделующего). Ну, это по моим дилетантским понятиям (хотя массивы в С++ изучал когда-то). Ну, да ладно. Я понял, что есть некие накладные расходы у списка по отношению к массиву и как они могут образовываться. А где всё же узнать про производительность в терминах "О" большое по всем коллекциям и их операциям по всем версиям Дотнетфреймворка? Или хотя бы для 4 и 4.5. Или это своего рода коммерческая тайна - как говорят на презентациях Майкрософт, "используйте наши продукты - всё будет хорошо". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 16:26 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
user7320, вообще интересно устройство. Наверное в обычном массиве [] элемент получается сдвигом указателя на 0 эелемнт + Х, а в LIST еще хранится указатель на следующий а может и предыдущий элемент. Или я херню написал?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 17:23 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
beg-in-er"список" это НЕ непрерывный, рваный. В .Net большая часть списков для хранения данных используют массивы - непрерывные области в памяти. fortibransa Списки, коллекции и пр. меняют размер с неким шагом ну типа +32. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 17:49 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
ЕвгенийВbeg-in-er"список" это НЕ непрерывный, рваный. В .Net большая часть списков для хранения данных используют массивы - непрерывные области в памяти. тота у меня при переходе со списков int на массив int ( в одной конкретной задаче ) скорость выросла в 10 раз. в любом случае скорость зависит от задачи. можно так всё сделать , что разницы не будет видно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 18:00 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
beg-in-er, мне кажется все просто - если заранее известно число элементов, то массив []. Если нужна динамика, то коллекция. ЗЫ Что же у вас были за объемы, что вы разницу почувствовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 18:55 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
Все виды листов (и даже StringBuilder) являются обёртками над массивами. Если массива перестаёт хватать - то выделяется новый массив, и в него копируются данные из предыдущего. Именно для этого в List и StringBuider есть конструктор, принимающий начальное значение элементов в массиве. Потери в производительности как раз и возникают из-за выделения и копирования. Сказки про "рваную кучу" читайте детям на ночь. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 19:47 |
|
Насколько всякие приведения коллекций друг к другу сильно тратят ресурсы?
|
|||
---|---|---|---|
#18+
Во, ещё нашёл http://stackoverflow.com/a/2658857/808128 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 15:59 |
|
|
start [/forum/topic.php?fid=20&msg=38060255&tid=1405507]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 323ms |
total: | 477ms |
0 / 0 |