C++11 连续关联容器:什么是最快的实现?

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或

经过2个月的应用数学研究,我发现了一种方法,可以在管理我的应用领域(即将出版…)中的数据方面获得巨大的收益。简而言之,我的应用程序域需要一个在内存中连续的关联容器,以避免大规模超级计算应用程序中的缓存未命中。快速插入和删除不是优先级:优先级是通过
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缓存

    为了获得更高的性能,请使用“完美散列”函数,这样可以避免对数据进行置乱,并将随机性降至最低。取而代之的是,试图找到并保存紧密访问的项目的时间位置,将其映射到空间位置

    不过,这种优化的散列仍然需要在其范围内保持一致。我使用了一个预分析步骤,对域进行随机采样以计算哈希函数。要增加这种复杂性,首先需要准确地知道在这些缓存未命中上花费了多少时间。

    有关您所询问的概念的经过良好测试、记录良好的实现,请参阅