You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA/VB6 Collection究竟是什么?其底层数据模型探究

关于VBA/VB6 Collection的底层结构分析

这确实是个戳中VB6/VBA老玩家痛点的问题——微软官方文档对Collection的内部实现几乎只字不提,只教你怎么用AddItemRemove这些方法,但从性能表现倒推,我们能还原出它的大致底层模型:

从性能表现反推结构

  • 整数键的O(N)访问速度:当你用整数索引(比如col.Item(3))访问元素时,性能随元素数量线性下降,这完全符合双向单链表的特征。因为整数索引对应的是元素的插入顺序,访问时需要从链表的头部或尾部开始遍历,直到找到对应位置的节点,所以时间复杂度是O(N)。
  • 字符串键的O(logN)访问速度:正如你提到的社区分析(wqw的评论),用字符串键访问时性能表现为对数级增长,这说明Collection内部为字符串键维护了一个有序索引结构(大概率是平衡二叉搜索树,比如红黑树)。这个结构会把字符串键映射到链表中的对应节点,查找时通过树结构快速定位,时间复杂度降到O(logN)。

推测的整体底层模型

简单来说,Collection双向单链表 + 字符串键索引树的组合体:

  1. 所有元素实际存储在双向单链表中,支持在任意位置插入、删除元素,同时保留插入顺序(这也是整数索引的依据);
  2. 当你添加带字符串键的元素时,除了把节点加入链表,还会在索引树中新增一个键值对,键是你指定的字符串,值是链表节点的引用;
  3. 访问时:
    • 用整数索引:直接遍历链表到对应位置;
    • 用字符串键:先通过索引树找到节点引用,再直接访问该节点。

为什么官方没有公开细节?

VB6是上世纪90年代的技术,微软当年并没有开放这类基础控件的底层实现细节,加上后来VB6被逐步淘汰,官方也就没有补充相关文档。这些结论都是社区开发者通过大量性能测试、逆向VB6运行时二进制文件得到的共识。

内容的提问来源于stack exchange,提问作者Adam Ryczkowski

火山引擎 最新活动