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

insert_begin_16384_highest

        往vector容器头部插入数据,所需要的时间会随着容器元素增多而变得很慢。

        除去vector,其他容器的表现是

insert_begin_16384

        表现最好的是forward_list、list、deque和unordedset。

        我们再将x轴变短

元素个数<1024

insert_begin_1024_highest

        vector在元素个数超过800左右时,性能开始“一骑绝尘”的差。

元素个数<256

insert_begin_256_highest

         对于这种小容器,unordered_map最差,其次是unordered_set,然后是multiset和set。

        vector容器只是比上述容器好点。

        最好的还是forward_list,其次是list、multimap、map和deque。

对比结果:

        性能持续最好的是forward_list、list和deque。

        unordered_set小容器时表现不是很突出,但是随着元素增多,性能还是可以的。

        map和unordered_map在小容器时表现还可以,但是随着元素增多,性能下降明显。

        vector在大容器时,表现很糟糕。

中间插入

元素个数>15000

insert_mid_16384_highest

        表现最差的还是vector,其次是unordered_map。

        除去vector,看看其他容器的表现

insert_mid_16384

        表现最好的是forward_list和list,然后是set、deque以及multiset。

元素个数<4096

insert_mid_4096_highest

        vector大概在元素个数超过1500左右时,开始“差”过所有的容器。在此之前,它大部分时候比unordered_map和set要好。

元素个数<256

insert_mid_256_highest

        set容器在元素个数超过250左右时,执行了高耗时操作。

        此时表现最好的是forward_list、deque。

对比结果:

        持续表现最好的是forward_list。

        小容器时,list表现不好。但是元素个数超过500左右时,list表现可以媲美forward_list。

        vector容器表现最差。

尾部插入

元素个数>15000

insert_end_16384_highest

        表现最好的是vector。

        表现最差的是unordered_mutlimap。map表现也不好。

元素个数<256

insert_end_256_highest

        小容器时,表现最好的是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)——插入

C++拾趣——STL容器的插入删除遍历和查找操作性能对比(ubuntu g++)——插入

C++中的STL(超详细的操作)

C++中的STL(超详细的操作)