【问题标题】:Contiguous associative container : what would be the fastest implementation?连续关联容器:最快的实现是什么?
【发布时间】:2014-04-21 22:58:52
【问题描述】:

经过 2 个月的应用数学研究,我找到了一种方法来管理我的应用领域中的数据(待发布...)。简而言之,我的应用程序域需要一个关联容器,在内存中是连续的,以避免大型超级计算应用程序中的缓存未命中。快速插入和删除不是优先级:优先级是通过std::upper_boundkeys 进行尽可能快的二分搜索。我有一个早期的工作实现,但现在我正在考虑实现一个具有良好设计的STL-like 容器。

所以,我的关联容器具有以下属性:

  • 它通常包含10100 数百万个keysvalues
  • keys8163264128 位的无符号整数
  • values 通常是 ~10 不同类型的元组
  • 每个key 关联到一个value
  • 最关键的操作是对keys 的二分查找(可能通过调用std::upper_bound
  • 插入/删除/排序并不重要

所以我的问题是:最好的内部实现是什么(当然我最终会运行一些基准测试,但放弃一些可能性会很好):

  1. std::vector<std::pair<Key, Type>> 带有指向 std::pair<Key, Type> 的迭代器
  2. std::pair<std::vector<Key>, std::vector<Type>> 带有指向 std::pair<Key&, Type&> 的迭代器
  3. 其他解决方案?

什么是最好的解决方案? 任何评论或想法将不胜感激......

【问题讨论】:

    标签: c++11 vector stl associative-array binary-search


    【解决方案1】:

    对于与您类似的应用程序,我使用开放式哈希方案取得了成功。

    “封闭哈希”维护映射到每个哈希值的对象列表。冲突会导致列表增长,但列表是不同的堆对象,缓存局部性较差。

    一个开放的散列进入同一个数组。适合 CPU 缓存。

    为了获得额外的性能,请使用类似“完美哈希”的函数,该函数避免扰乱数据并最小化随机性。而是尝试查找并保留靠近访问的项目的时间局部性,将其映射到空间局部性。

    不过,这种优化的散列仍然需要在其范围内保持一致。我使用了预分析步骤,随机抽样域来计算哈希函数。增加这种复杂性需要首先准确了解这些缓存未命中所花费的时间。

    【讨论】:

      【解决方案2】:

      请参阅Boost.Containerboost::container::flat_map<>,以了解您所询问的概念的经过充分测试、有据可查的实施。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 2023-03-12
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        相关资源
        最近更新 更多