池容器的最佳数据结构是什么?
目前,我使用 STL 矢量容器模板来放回和获取连接。
1) 在获取时,返回一个连接并从池向量中“erase()”d。
2) 释放时,连接通过“push_back()”交回池。
如果经常使用泳池,这可能会很重。所以我的问题是,有没有办法通过切换到其他数据结构来提高这里的性能?
At the moment i use the STL vector container template to put back and get the connections.
1) on get, a connection is returned and "erase()"d from pool vector.
2) on release, the connection is handed back to the pool via "push_back()".
This might be very heavy if the pool is frequently used. So my question is, is there any way to improve the performance here by switching to an other data structure?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
vector
就可以了。deque
。list
。set
可能是一种替代方案。无论如何,您都应该分析性能;对主容器使用 typedef,以便您可以快速切换和测试不同的选项。
可能还有其他您没有告诉我们的要求,但这些要求对于容器的选择很重要:
vector
is fine.deque
.list
.set
might be an alternative.In any case, you should profile the performance; use a typedef for your main container so you can quickly switch and test the different options.
There may be other requirements which you aren't telling us but which are important for the choice of container:
std::vector
可能是池的最佳容器。插入的时间复杂度为 O(1),如果不需要维持顺序,删除也可以为 O(1)。您可以仅交换最后一个项目并删除该项目并缩小向量。此外,与其他容器相比,std::vector 的空间效率相当高。低内存消耗还意味着更好的性能,因为 CPU 缓存命中率更高。std::vector
is probably the best container for pool. O(1) for insertion and you can also have O(1) for removal if you don't need to maintain order. You can just swap the last item with the item removed and shrink the vector. Alsostd::vector
is pretty space efficient compared to other containers. Low memory consumption also means a better performance because of more CPU cache hits.如果您提前知道可能的最大连接数,请保留向量(请参阅向量::保留)。
否则使用 std::list。
最后,它还取决于您的平台以及所使用的编译器和 libstdc++ 的版本。
Keep vector if you know the maximum number of connections possible in advance (see vector::reserve).
Otherwise use std::list.
At the end it also depends of your platform and the version of the compiler and libstdc++ used.