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仍然是我获得最佳性能的首选方案.
Boost.Interprocess和Boost.Container提供平面集和平面地图,可以帮助您提高应用程序的性能.
最近Boost邮件列表上的一篇文章讨论了类似的内容.
Howard Hinnant创建了一个可以使用堆栈而不是堆的分配器.
http://howardhinnant.github.io/stack_alloc.html