经过2个月的应用数学研究,我找到了一种方法,可以在我的应用领域(待发布......)中管理数据。简而言之,我的应用程序域需要一个关联容器,在内存中是连续的,以避免大规模超级计算应用程序中的缓存未命中。快速插入和删除不是优先事项:优先级是通过keys
在std::upper_bound
上进行最快速的二分查找。我有一个早期的工作实现,但现在我正在考虑实现一个设计良好的STL-like
容器。
因此,我的关联容器具有以下属性:
10
和100
数百万keys
和values
keys
是8
,16
,32
,64
或128
位values
通常是~10
种不同类型的元组key
都与一个value
keys
上的二元搜索(可能是通过调用std::upper_bound
)所以我的问题是:什么是最好的内部实现(当然我最终会运行一些基准,但放弃一些可能性会很棒):
std::vector<std::pair<Key, Type>>
包含std::pair<Key, Type>
std::pair<std::vector<Key>, std::vector<Type>>
包含std::pair<Key&, Type&>
什么是最好的解决方案? 任何评论或想法将不胜感激......
答案 0 :(得分:1)
对于与您类似的应用程序,我已经成功使用了开放哈希方案。
“封闭散列”维护映射到每个散列值的对象列表。冲突导致列表增长,但列表是具有较差缓存局部性的不同堆对象。
一个开放的哈希全部进入同一个数组。适用于CPU缓存。
为了获得额外的性能,请使用“完美哈希”类功能,避免加扰数据,最小化随机性。相反,尝试查找并保留近距离访问的项目的时间局部性,将其映射到空间局部性。
但是,这样的优化哈希仍然需要在其范围内保持一致。我使用了预分析步骤,随机对域进行采样以计算哈希函数。这种复杂性的增加需要通过首先确切知道花在这些缓存未命中上的时间来推动。
答案 1 :(得分:1)
请参阅Boost.Container boost::container::flat_map<>
,了解您所询问的概念的经过充分测试,记录良好的实施方案。