C++11 连续关联容器:什么是最快的实现?
经过2个月的应用数学研究,我发现了一种方法,可以在管理我的应用领域(即将出版…)中的数据方面获得巨大的收益。简而言之,我的应用程序域需要一个在内存中连续的关联容器,以避免大规模超级计算应用程序中的缓存未命中。快速插入和删除不是优先级:优先级是通过C++11 连续关联容器:什么是最快的实现?,c++11,vector,stl,associative-array,binary-search,C++11,Vector,Stl,Associative Array,Binary Search,经过2个月的应用数学研究,我发现了一种方法,可以在管理我的应用领域(即将出版…)中的数据方面获得巨大的收益。简而言之,我的应用程序域需要一个在内存中连续的关联容器,以避免大规模超级计算应用程序中的缓存未命中。快速插入和删除不是优先级:优先级是通过std::upper_bound对键进行尽可能快的二进制搜索。我有一个早期的工作实现,但现在我正在考虑用一个好的设计实现一个类似STL的container 因此,我的关联容器具有以下属性: 它通常包含10和100百万个键和值 键是8、16、32、64或
std::upper_bound
对键进行尽可能快的二进制搜索。我有一个早期的工作实现,但现在我正在考虑用一个好的设计实现一个类似STL的container
因此,我的关联容器具有以下属性:
- 它通常包含
10
和100
百万个键
和值
键是8
、16
、32
、64
或128
位的无符号整数
值通常是不同类型的~10
元组
- 每个
键
都与单个值关联
- 最关键的操作是对
键进行二进制搜索(可能通过调用std::upper_bound
)
- 插入/删除/排序并不重要
所以我的问题是:最好的内部实现是什么(当然,我最终会运行一些基准测试,但放弃一些可能性会更好):
std::vector
使用迭代器对std::pair
std::pair
使用迭代器对std::pair
其他解决方案
最好的解决方案是什么?
如果您有任何意见或想法,我们将不胜感激……对于与您类似的应用程序,我已经成功地使用了开放哈希方案
“封闭散列”维护映射到每个散列值的对象列表。冲突会导致列表增长,但列表是不同的堆对象,缓存位置较差
一个开放的散列将全部放入同一个数组中。有利于CPU缓存
为了获得更高的性能,请使用“完美散列”函数,这样可以避免对数据进行置乱,并将随机性降至最低。取而代之的是,试图找到并保存紧密访问的项目的时间位置,将其映射到空间位置
不过,这种优化的散列仍然需要在其范围内保持一致。我使用了一个预分析步骤,对域进行随机采样以计算哈希函数。要增加这种复杂性,首先需要准确地知道在这些缓存未命中上花费了多少时间。有关您所询问的概念的经过良好测试、记录良好的实现,请参阅