在我正在研究的程序中,在std::unordered_map
的默认分配器内存中花费了大量时间。地图经常添加和删除数据,每次插入时发生的分配限制了程序的性能。 (性能特别糟糕,因为计算机上的所有64个核心都在分配/解除分配相同类型的节点,并且似乎存在争用某些内部锁定。)
为了提高性能和降低分配器压力,我正在尝试使用池分配器(boost::object_pool
)来重用内存。此外,如果密钥/值存储在本地池中,我预计程序可能会从数据局部性改进中获得一些性能提升。
std::unordered_map
似乎为哈希分配内存,并分别为键值对对象分配(如std::pair<const Key, Value>
)。但是,只有一个allocator模板参数,这似乎设置了用于两个对象的分配器。如何为这两件事使用不同的分配器?
在某些情况下,我看到std::scoped_allocator_adaptor
建议,但我最好能说明这实际上是在嵌套容器中指定不同的分配器,而不是在同一个容器中。