我在VB6中有一些代码可以创建一个中等大小的树结构(几千个节点)。除非销毁对树的最后一个引用,否则性能就足够了。有时可能需要一秒或更长时间。我已经尝试在删除节点本身之前杀死每个节点内的所有内部引用,但这似乎没有帮助。是否有一些技巧可以加速vb6使用其参考计数器做什么?表现似乎存在显着的N ^ 2方面。
顺便说一下,我知道VB6已经过时了,但是我有人抱怨这段代码,这段时间我写的很久但仍在使用中。
顺便说一下,树不是二叉树,而是允许每个节点拥有一个任意数量的子节点,保存在Collection中并按名称访问(因此一个节点可能是TheTree!这就是!那个!TheOtherThing!Whatever,又名TheTree(“This”)(“That”)(“TheOtherThing”)(“Whatever”))。答案 0 :(得分:3)
VB6集合对象因发布内容缓慢而臭名昭着,尤其是当包含很多引用时。
您可以尝试替换集合,例如this。对于VB6,还有许多其他替换集合应该基本上不兼容。
您可能还想在集合对象上阅读Bruce Mckinney的take。
编辑:更多Bruce McKinney信息here
答案 1 :(得分:1)
我不想成为坏消息的承载者,但我怀疑你能否减少终止对象树所花费的时间。 10年前我在VB6中共同开发了SQL Accord - 一个进行数据库比较的应用程序。因此,您可以想象您在内存中持有数千个对象(例如表/视图/ sproc / etc定义),以便能够快速比较它们。
由于OP带来的问题,将这些物品藏在收藏品中的最初设计落在了地板上。罪魁祸首是COM垃圾收集方案 - 它需要清理你将对象设置为Nothing / Null的那一刻,然后很可能需要对内存空间进行碎片整理 - 这需要时间。
我的解决方案(当时很痛苦)是将所有对象转换为TYPE结构并将集合转换为类型数组。然后我构建了管理器对象来处理数组/类型/等...
即使代码闻到你的味道 - 我的性能提升了10倍。为什么?因为TYPE结构在堆栈上,而对象在堆上,在那里处理它们要贵得多。
答案 2 :(得分:1)
Curland的Advanced Visual Basic解释了如何创建轻量级COM对象以及如何在使用自定义内存管理器的大型对象系统中组织这些对象的实例。好处基本上是您可以分配大量单个(或多个但不多)内存块来存储可以一次性释放的所有实例。这将拆卸时间减少到零。
轻量级对象是包含在COM接口中的结构体(VB6中的Type
),因此看起来像普通的COM对象。 UDT的数组被快速分配和销毁,因为它们占用了一块内存。