我正在另一个论坛上阅读以下帖子,该帖子来自一个似乎对 C++ 内部知识非常了解的关于将数千个键插入“字典”的人:
e) Map and Set 查找是使用红黑树或平衡树完成的,并且每个项目都是“单独”分配的,因此如果您要分配 500,000 个仪器 [按符号] 并带有指向相关仪器对象类的指针,您字符串有'N'个字节[加上开销],指针有4个字节[加上开销]。并包括;所有工具的一分钟、五秒、一秒价格时间序列和 STD 容器中所有这些工具的完整交易历史。由于小对象分配开销,这是大量的内存和更多的浪费!
f) 众所周知,STD Map & Set 使用 LowerBound [Less Than Compare] 遍历所有键来查找,这非常慢。
g)一些天才可能会说“不,他们使用未排序的地图”......他们没有,但即使他们这样做了,他们仍然在对离散分配的元素进行字符串比较。
我在 C++ 中所做的是以下(示例);
a)创建一个“自定义”就地字符串类对象,它有两个个性;a) 一个字节数组,和 b) 一个整数数组[模数为 4 并在本机边界上对齐]。b) 使用自定义映射和设置,它们是基于 2x 维度的散列,节点分配在平坦连续内存区域中[可以动态调整大小]。c) String [integer format] Hashing 由 Integer 完成以流水线化 CPU,并且 Key 比较类似地完成。
使用这些只能在 C++、C 或 ASM 中完成的技术,在 .NET、C# 或 Java 中完成的相同操作的性能至少要高 4-5 倍。
如果我大致知道我将插入多少个键,我可以使用哪些技术来设计我自己的 unordered_map 实现,这对于我的特定用途来说比标准实现更有效?
(欢迎任何关于设计散列函数的 101)