Самый быстрый способ уничтожить древовидную структуру в VB6 - PullRequest
7 голосов
/ 10 мая 2011

У меня есть некоторый код в VB6, который создает умеренно большую древовидную структуру (несколько тысяч узлов). Производительность адекватна, за исключением случаев уничтожения последней ссылки на дерево. Иногда это может занять секунду или больше. Я пытался убить все внутренние ссылки в каждом узле перед удалением самого узла, но это, похоже, не помогает. Есть ли какая-то хитрость для ускорения того, что vb6 делает со своими счетчиками ссылок? Кажется, есть существенный аспект N ^ 2 в исполнении.

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

Кстати, дерево не является двоичным деревом, но вместо этого позволяет каждому узлу иметь произвольное количество дочерних элементов, хранящихся в коллекции и доступных по имени (так что один узел может быть TheTree! This! That! TheOtherThing! aka TheTree ("This") ("That") ("TheOtherThing") ("Что угодно")).

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

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

Вы можете попробовать заменяющую коллекцию, например this .Существует ряд других заменяющих коллекций для VB6, которые по существу должны быть несовместимы.

Возможно, вы также захотите прочитать о Брюсе Маккинни на объекте коллекции.

РЕДАКТИРОВАТЬ: Больше информации о Брюсе МакКинни здесь

1 голос
/ 12 мая 2011

Curland's Advanced Visual Basic объясняет, как создавать легкие COM-объекты и как организовать их экземпляры в больших системах объектов, которые используют собственный менеджер памяти.Преимущество в основном в том, что вы можете выделить большой один (или несколько, но не много) кусок памяти для хранения всех экземпляров, которые могут быть освобождены за один раз.Это сокращает время разрыва до нуля.

Легкие объекты - это структуры (Type s в VB6), обернутые в интерфейсы COM, чтобы выглядеть как обычные объекты COM.Массивы UDT распределяются и уничтожаются очень быстро, так как они занимают один кусок памяти.

1 голос
/ 12 мая 2011

Я ненавижу быть носителем плохих новостей, но я сомневаюсь, что вы сможете сократить количество времени, которое требуется для завершения дерева объектов. Примерно 10 лет назад я совместно разработал SQL Accord в VB6 - приложении, которое сравнивало базы данных. Таким образом, как вы можете себе представить, вы храните тысячи объектов в памяти (например, определения таблиц / представлений / sproc / и т.д.), чтобы иметь возможность их быстрого сравнения.

Первоначальный дизайн хранения этих предметов в коллекциях упал на пол из-за проблем, возникших у ОП. Виновником является схема сбора мусора в COM - она ​​должна быть очищена в тот момент, когда вы установите для объекта значение Nothing / Null, а затем, скорее всего, потребуется дефрагментировать пространство памяти, что занимает время.

Моим решением (болезненным в то время) было преобразование всех объектов в структуры TYPE и преобразование коллекций в массивы типов. Затем я построил объекты менеджера для работы с массивами / типами / и т.д ...

Несмотря на то, что код пахнет, когда вы на него смотрите, я получил увеличение производительности в 10 раз. Зачем? Потому что структуры TYPE помещаются в стек, а объекты - в кучу, где избавиться от них гораздо дороже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...