СообЧа > База Знаний > Программирование > Visual Basic

Вопрос

Почему массивы работают в десятки раз быстрее коллекций и занимают меньше места в оперативной памяти.
Использовался VB .NET и коллекция ArrayList.

Ответ

Не знаю, как обстоят дела в VB .NET, а в 6-ом VB коллекция представляет собой целый объект. И сама по себе коллекция требует намного больше памяти, чем массив с таким же типом данных.

И еще. Если обращаешься к элементу коллекции, вызывается несколько попутных методов. А если ты склепал коллекцию средствами Строителя Классов, то к этому ненужному обращению добавляется и низкая скорость работы кода, написанного на VB. Но коллекции имеют одно неоспоримое преимущество перед массивами — ты можешь в любое место коллекции вставить элемент, или удалить элемент из любого места. С массивами такой фокус не проходит. Добавлять элементы можно только в конец, а чтоб добавить его в середину массива, потребуется сдвинуть все элементы на 1 вниз. (а если там за 1000 элементов и добавить новый надо именно в начало?). Такая же ситуация и с удалением из массива.

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

Артем Кривокрисенко

Допустим ты создаешь массив лонгов

dim i(30) as long
басик выделяет память mem размером 30*sizeof(long) (=30*4)
Когда ты обращаешься допустим к 18-у элементу, то он делает так:
CopyMemory(ret,mem(18*4),4)

mem(18*4) — это начальная позиция откуда он копирует, как вариант, он может просто вернуть этот адрес без копирования ret — это то что тебе вернется

При работе с коллекцией:
происходит работа типа со структурой (внутренняя организация)

struct item
{
lpPrev as long
lpNext as long
lpData as long
}


lpPrev и lpNext это указатели на такие же структуры (выделенные блоки памяти)
lpData указатель на данные (который as any), откуда они и извлекаются когда ты к ним обращаешься

Поэтому невозможен быстрый доступ к определенному элементу, как в массиве, коллекция каждый раз перебирает все элементы пока не дойдет до нужного индекса.
Зато возможно удаление даже из середины, когда в элементе i+1 lpPrev присваивается знаечение lpPrev из i, i-1 lpNext равно lpNext i-го элемента, при этом освобождается блок памяти по адресу lpData, затем освобождается блок данных содержащий эти указатели.

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

Соответственно коллекция занимает больше потому что ее приходиться хранить еще и структуры с указателями.

Ivan R



Copyright © 2000-2004 Сообщество Чайников
Контактная информация