【问题标题】:what is the optimal data structure for a pool container?池容器的最佳数据结构是什么?
【发布时间】:2011-10-23 23:14:45
【问题描述】:

目前我使用 STL 矢量容器模板放回并获取连接。

1) 在获取时,返回一个连接并从池向量中“擦除()”。

2) 释放时,连接通过“push_back()”交还给池。

如果经常使用该池,这可能会非常繁重。所以我的问题是,有没有办法通过切换到其他数据结构来提高这里的性能?

【问题讨论】:

  • 很少有瓶颈是我们想象的那样,所以分析比试图毫无头绪地优化要好得多。
  • 确定 - 分析。但从概念上看,这是使用容器的正确方法,我猜......

标签: c++ stl containers connection-pooling


【解决方案1】:
  • 如果你只在后面追加并从后面擦除,vector 很好。
  • 如果您从正面和背面都追加和擦除,但从不从中间追加和擦除,请使用deque
  • 如果您经常需要从中间插入和擦除,请使用list
  • 根据您的查找和遍历要求,set 可能是一个替代方案。

无论如何,你应该分析表现;为您的主容器使用 typedef,以便您可以快速切换和测试不同的选项。

可能还有其他一些您没有告诉我们但对选择容器很重要的要求:

  • vector 和 deque 是随机访问容器; list 和 set 是基于节点的。这会影响迭代器失效。
  • vector、deque 和 list 是序列容器,而 set 是关联容器;这会影响按值查找。

【讨论】:

  • 我还要补充一点,如果 OP 没有从后面擦除,他应该考虑这种方法(即总是 pop_backpush_back) - 这是一个池,所以我猜没有顺序,无论如何总是使用最后一项可能是有益的......
  • @Nim:好点子 - 我没有涉及环境编码问题,但是(也如 Juraj 的回答)交换元素以使所有访问都集中在一端是一个好主意。 vector 是最简单、最经济的容器,所以如果代码重新设计使其可行,那总是一件好事。
  • 我知道这个建议是传统上给出的,但我自己的测量表明它并不正确。除非复制非常昂贵(newdelete 在复制构造函数或赋值运算符中),如果元素的典型数量不是太大,std::vector 将击败所有其他元素。使用std::list 的唯一原因是避免迭代器失效。缺乏局部性会扼杀它原本可能拥有的任何性能优势。
  • @James:非常合理——这就是为什么你必须分析 :-) 不幸的是,渐近保证对现实世界的行为只字未提!
【解决方案2】:

std::vector 可能是最好的池容器。 O(1) 用于插入,如果您不需要维护顺序,您也可以使用 O(1) 进行移除。您可以将最后一个项目与删除的项目交换并缩小向量。与其他容器相比,std::vector 也非常节省空间。由于更多的 CPU 缓存命中,低内存消耗也意味着更好的性能。

【讨论】:

    【解决方案3】:

    如果您事先知道可能的最大连接数,请保留 vector(请参阅 vector::reserve)。

    否则使用 std::list。

    最后,它还取决于您的平台以及使用的编译器和 libstdc++ 的版本。

    【讨论】:

    • std::list 表示每次插入的分配。这不会比std::vector 快。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多