C++拾趣——STL容器的插入删除遍历和查找操作性能对比(ubuntu g++)——插入
Posted breaksoftware
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++拾趣——STL容器的插入删除遍历和查找操作性能对比(ubuntu g++)——插入相关的知识,希望对你有一定的参考价值。
操作系统是ubuntu 18.04.1 server amd64,gcc是 7.3.0。编译产出是64位测试程序。(转载请指明出于breaksoftware的csdn博客)
因为加入测量,就会导致误差。我已经尽量将环境影响降低,但是还是难免有误差。大家可以通过文后附的工程自行测量,结果可能和我存在一定的出入。
文中将测试vector、list、forward_list、deque、set(multiset)、unordered_set(unordered_multiset)、map(multimap)和unordered_map(unordered_multimap)。没有讨论stack、queue和priority_queue,是因为它们底层是使用deque或者vector实现的。
template <class T, class Container = deque<T> > class stack;
template <class T, class Container = deque<T> > class queue;
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
增加和删除操作将从容器的头部、中部、尾部三个位置进行对比;这儿的三个位置并非是指其物理地址关系,而是指通过迭代器表现的位置关系。
遍历分为从头部和尾部两个方向遍历;
查找操作只对比set和map系列容器。因为其他容器的查找都需要遍历进行对比,性能远不及这两类容器。
插入
头部插入
元素个数>15000
往vector容器头部插入数据,所需要的时间会随着容器元素增多而变得很慢。
除去vector,其他容器的表现是
表现最好的是forward_list、list、deque和unordedset。
我们再将x轴变短
元素个数<1024
vector在元素个数超过800左右时,性能开始“一骑绝尘”的差。
元素个数<256
对于这种小容器,unordered_map最差,其次是unordered_set,然后是multiset和set。
vector容器只是比上述容器好点。
最好的还是forward_list,其次是list、multimap、map和deque。
对比结果:
性能持续最好的是forward_list、list和deque。
unordered_set小容器时表现不是很突出,但是随着元素增多,性能还是可以的。
map和unordered_map在小容器时表现还可以,但是随着元素增多,性能下降明显。
vector在大容器时,表现很糟糕。
中间插入
元素个数>15000
表现最差的还是vector,其次是unordered_map。
除去vector,看看其他容器的表现
表现最好的是forward_list和list,然后是set、deque以及multiset。
元素个数<4096
vector大概在元素个数超过1500左右时,开始“差”过所有的容器。在此之前,它大部分时候比unordered_map和set要好。
元素个数<256
set容器在元素个数超过250左右时,执行了高耗时操作。
此时表现最好的是forward_list、deque。
对比结果:
持续表现最好的是forward_list。
小容器时,list表现不好。但是元素个数超过500左右时,list表现可以媲美forward_list。
vector容器表现最差。
尾部插入
元素个数>15000
表现最好的是vector。
表现最差的是unordered_mutlimap。map表现也不好。
元素个数<256
小容器时,表现最好的是vector和forward_list。
对比结果:
vector的表现最好。
结论:
vector容器在头部、中间插入时性能随着元素个数增多,性能变的非常糟糕。但是在尾部插入场景下,性能是极好的。
forward_list和deque的插入操作性能在各种场景下,都比较好。
list容器在头部和中间插入时,效率很好。但是在尾部插入时,性能不太好。
文中图例可从以下地址获取:https://github.com/f304646673/stl_perf/tree/master/linux
以上是关于C++拾趣——STL容器的插入删除遍历和查找操作性能对比(ubuntu g++)——插入的主要内容,如果未能解决你的问题,请参考以下文章
C++拾趣——STL容器的插入删除遍历和查找操作性能对比(Windows VirtualStudio)——删除
C++拾趣——STL容器的插入删除遍历和查找操作性能对比(ubuntu g++)——删除
C++拾趣——STL容器的插入删除遍历和查找操作性能对比(Windows VirtualStudio)——插入