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

16 篇文章 9 订阅

        操作系统是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
insert_begin_16384_highest

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

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

insert_begin_16384
insert_begin_16384

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

        我们再将x轴变短

元素个数<1024

insert_begin_1024_highest
insert_begin_1024_highest

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

元素个数<256

insert_begin_256_highest
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
insert_mid_16384_highest

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

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

insert_mid_16384
insert_mid_16384

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

元素个数<4096

insert_mid_4096_highest
insert_mid_4096_highest

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

元素个数<256

insert_mid_256_highest
insert_mid_256_highest

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

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

对比结果:

        持续表现最好的是forward_list。

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

        vector容器表现最差。

尾部插入

元素个数>15000

insert_end_16384_highest
insert_end_16384_highest

        表现最好的是vector。

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

元素个数<256

insert_end_256_highest
insert_end_256_highest

        小容器时,表现最好的是vector和forward_list。

对比结果:

        vector的表现最好。

结论:

        vector容器在头部、中间插入时性能随着元素个数增多,性能变的非常糟糕。但是在尾部插入场景下,性能是极好的。

        forward_list和deque的插入操作性能在各种场景下,都比较好。

        list容器在头部和中间插入时,效率很好。但是在尾部插入时,性能不太好。

        文中图例可从以下地址获取:stl_perf/linux at master · f304646673/stl_perf · GitHub

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breaksoftware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值