【问题标题】:Is there a container similar to `std::deque` but with custom block size and better performance?是否有类似于 `std::deque` 但具有自定义块大小和更好性能的容器?
【发布时间】:2022-06-30 05:19:17
【问题描述】:

std::vector 相比,std::deque 的缺点是在访问随机位置的元素时性能较慢,而且存储数据的内存块具有预定义的固定大小。

是否有替代(甚至在 STL 之外)容器类允许:

  • 在构造函数中为所有块设置块大小,或者
  • 为每个块设置不同的块大小。
  • 防止大多数索引访问必须执行两个指针取消引用;例如一旦我访问某个内存块中的元素,同一内存块中的以下访问应该具有类似std::vector 的性能。

注意:我感兴趣的是与访问元素相关的性能,而不是它们的插入/删除。

【问题讨论】:

  • “块大小”和“两个指针解引用”是实现细节。容器没有由它们的实现来指定;它们由它们的接口和这些接口的属性指定。你想用这个假设的容器做什么?
  • 如果你能描述你想用你的数据做什么,而不是你认为它应该如何工作,那将会很有帮助。你有排序数据吗?您是否更频繁地阅读或写作,是否以可预测的方式访问它(缓存命中/分支预测)等。以及您想要解决的实际问题是什么。性能不是一招一式的小马
  • @TedLyngmo 我也在考虑这些问题。最后,如果性能符合预期/指定,OP 应该测量实际数据。衡量总是衡量......
  • 如果你打算在迭代器中隐藏目标数据结构实现的复杂性(就像 STL 主要做的那样),那么你很难像std::vector 一样快。实际上,std::vector 在内存中是连续的,并且具有简单的迭代器实现。因此,编译器可以执行许多高级优化(例如矢量化),从而在许多情况下带来巨大的性能提升。使用这种基于块的结构,您需要使用缓慢的条件(或导致等效的循环携带依赖的技巧),这往往会阻止编译器优化。
  • 如果您想知道“不可预测”的性能(增益)如何可以观看:youtube.com/watch?v=FJJTYQYB1JQ (youtube.com/watch?v=FJJTYQYB1JQ)。

标签: c++ performance stdvector deque stddeque


【解决方案1】:

请在 GitHub 上查看我的库:https://github.com/slavenf/sfl-library

这个库提供容器sfl::segmented_vector。这个容器类似于std::deque。块的大小(我称它们为段)在编译时作为模板参数指定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多