我的程序经常使用boost :: unordered_map,地图有大约4000万个条目。该程序不经常插入或删除。它只是使用密钥随机访问条目。
我想知道如果我将条目值(每个大约1 KB)存储在一个平面数组(可能是std :: vector)中,它会改善性能(就访问条目的速度而言),以及我使用boost :: unordered_map存储键到这个数组索引的映射。
谢谢, 崔
答案 0 :(得分:2)
是的,这可能会严重加快速度。事实上,这就是Boost flat_map
的用途:)
使用排序向量而不是基于树的关联容器是C ++世界中众所周知的技术。 Matt Austern的经典文章 Why You Shouldn't Use set, and What You Should Use Instead (C++ Report 12:4, April 2000,
...
这比你要求的更多,因为你甚至不需要无关的索引。这为您提供了更多的引用位置和更低的内存占用。最重要的是,它在界面方面为您提供了较低的复杂性( - >更少的错误)和std::[unordered_]map
的直接替代。
答案 1 :(得分:0)
将值存储在连续内存中,如std :: vector提供,将增加缓存局部性。这可以在性能上产生很大的差异,但这取决于访问模式。
如果你的狩猎表现,请记住黄金法则: 总是衡量!