我用VB6编写了一些代码,它创建了一个中等大小的树结构(几千个节点)。除非销毁对树的最后一个引用,否则性能是足够的。这有时可能需要一秒钟或更长时间。在删除节点之前,我已经尝试过清除每个节点中的所有内部引用,但这似乎没有什么帮助。是否有什么技巧可以加速vb6对其引用计数器所做的操作?性能似乎有一个重要的N^2方面。
顺便说一句,我知道VB6已经过时了,但有人抱怨我很久以前写的这段代码,但它仍然在使用中。
顺便说一句,树不是二叉树,而是允许每个节点有任意数量的子节点,保存在集合中并按名称访问(因此一个节点可能是TheTree!This!That!TheOtherThing!随便什么,也就是TheTree("This")("That")("TheOtherThing")("Whatever")).
发布于 2011-05-11 04:25:47
VB6集合对象以释放其内容缓慢而臭名昭著,特别是当有大量包含的引用时。
您可以尝试替换集合,如this。VB6还有许多其他的替代集合,它们基本上应该是兼容的。
您可能还想阅读Bruce Mckinney关于集合对象的take。
编辑:更多布鲁斯McKinney信息here
发布于 2011-05-12 06:05:44
我讨厌成为坏消息的传播者,但我怀疑您是否能够减少终止对象树所需的时间。大约10年前,我在VB6中与人共同开发了SQL Accord --一个进行数据库比较的应用程序。因此,正如您可以想象的那样,您在内存中保存了数千个对象(例如,表/视图/存储过程/等定义),以便能够快速比较它们。
由于OP带来的问题,最初将这些对象保存在集合中的设计失败了。罪魁祸首是COM垃圾收集方案-它需要在您将对象设置为Nothing/Null时进行清理,然后很可能需要对内存空间进行碎片整理-这需要时间。
我的解决方案(当时很痛苦)是将所有对象转换为类型结构,并将集合转换为类型数组。然后我构建了管理器对象来处理数组/类型/等...
尽管代码看起来有股臭味,但我的性能提高了10倍。为什么?因为类型结构放在堆栈上,而对象放在堆上,在堆上处理它们的成本要高得多。
发布于 2011-05-12 18:30:54
Curland的Advanced Visual Basic解释了如何创建轻量级COM对象,以及如何在使用自定义内存管理器的大型对象系统中组织这些对象的实例。基本的好处是,您可以分配一个很大的内存块(或几个,但不是很多)来存储可以一次性释放的所有实例。这样可以将拆卸时间减少到零。
轻量级对象是包装在COM接口中的结构(VB6中的Type
),以便看起来像常规的COM对象。UDT数组的分配和销毁速度非常快,因为这些数组占用了单个内存块。
https://stackoverflow.com/questions/5955578
复制相似问题