使用连续内存并具有保留功能的映射和集合

edA*_*a-y 24 c++ collections boost stl

我使用了几张地图和套装.缺乏连续的内存和大量的(de)分配是性能瓶颈.我需要一个主要是STL-compatbile的map和set类,它可以为内部对象(或多个块)使用连续的内存块.它还需要有一个reserve功能,以便我可以预先分配预期的大小.

在我自己编写之前,我想先查看可用的内容.Boost中有什么可以做到的吗?有人知道其他地方有可用的实施吗?


侵入式集合类型在此处不可用,因为在多个集合中需要存在相同的对象.据我所知,STL内存池是每个类型,而不是每个实例(有点,有点不是,很多警告).这些全局池在mutli-cpu/core处理中的内存局部性方面效率不高.

对象池不起作用,因为类型将在实例之间共享,但它们的池不应该.

在许多情况下,哈希映射可能是一种选择.

Mah*_*dsi 14

看看这个:Google Sparse Hash Map.自从我几年前偶然发现它以来,它一直是我最喜欢的C++库.

它的性能令人难以置信,同时具有地图和集合类,并具有要求保留功能.我已经将无数项目从各种其他类似地图的数据结构转换为google sparsehash,结果令人难以置信.语法与C++ 0x兼容unordered_map(可怕,可怕的名字!),但也有额外的功能和特性.

在内部,它使用sparsehashing技术使用哈希表实现.

编辑(2015年5月13日)

由于这已经成为一个流行的答案,我只是想指出我近年来使用的另外两个类似地图的结构.的中号 iscellaneous Ç ontainer Ť emplates(MCT)库提供下拉式在几个品种兼容高性能unorderd_map实现:

它提供了六个通用哈希表容器 - closed_hash_set,closed_hash_map,linked_hash_set,linked_hash_map,forward_hash_set和forward_hash_map.前两个与TR1 unordered_set和unordered_map非常相似.链接的提供附加功能,而前向哈希表比链接更有效,但具有受限制的接口.在某些情况下,通过可选的侵入性支持,可以进一步提高closed_hash_*容器的性能.

愚蠢的Facebook有一些真正伟大的结构.它们本身没有drop-in unordered_map替换,但是unordered_map有一个无锁/线程安全的实现,并且fbvector由于更好的内存使用和布局,构建可以带来巨大的性能提升.

在我的测试中,对于单线程代码,Google dense_hash_map仍然是我获得最佳性能的首选方案.

  • 谢谢,我会检查一下.`unordered_map`实际上是一个好名字 - 它遵循命名抽象集合而不是支持结构的约定. (3认同)

Vic*_*iba 7

Boost.Interprocess和Boost.Container提供平面集和平面地图,可以帮助您提高应用程序的性能.

请参阅https://svn.boost.org/svn/boost/sandbox/move/libs/container/doc/html/boost_container_reference.html#header.boost.container.flat_set_hpp


dal*_*lle 6

最近Boost邮件列表上的一篇文章讨论了类似的内容.

Howard Hinnant创建了一个可以使用堆栈而不是堆的分配器.

http://howardhinnant.github.io/stack_alloc.html


Pup*_*ppy 6

您可以使用向量和二进制搜索它来连续存储和reserve()以及维护O(logn).但是,插入会更昂贵.


Jør*_*ogh 1

您可能想看看 Google 的TCMalloc。它是 malloc 的直接替代品,可能会加速您的程序。TCMalloc 是专门为多线程设计的。