日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時(shí)間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? 操作系統(tǒng)是ubuntu 18.04.1 server amd64,gcc是?7.3.0。編譯產(chǎn)出是64位測(cè)試程序。(轉(zhuǎn)載請(qǐng)指明出于breaksoftware的csdn博客)

? ? ? ? 因?yàn)榧尤霚y(cè)量,就會(huì)導(dǎo)致誤差。我已經(jīng)盡量將環(huán)境影響降低,但是還是難免有誤差。大家可以通過文后附的工程自行測(cè)量,結(jié)果可能和我存在一定的出入。

? ? ? ? 文中將測(cè)試vector、list、forward_list、deque、set(multiset)、unordered_set(unordered_multiset)、map(multimap)和unordered_map(unordered_multimap)。沒有討論stack、queue和priority_queue,是因?yàn)樗鼈兊讓邮鞘褂胐eque或者vector實(shí)現(xiàn)的。

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;

? ? ? ? 增加和刪除操作將從容器的頭部、中部、尾部三個(gè)位置進(jìn)行對(duì)比;這兒的三個(gè)位置并非是指其物理地址關(guān)系,而是指通過迭代器表現(xiàn)的位置關(guān)系。

? ? ? ? 遍歷分為從頭部和尾部?jī)蓚€(gè)方向遍歷;

? ? ? ? 查找操作只對(duì)比set和map系列容器。因?yàn)槠渌萜鞯牟檎叶夹枰闅v進(jìn)行對(duì)比,性能遠(yuǎn)不及這兩類容器。

插入

頭部插入

元素個(gè)數(shù)>15000

insert_begin_16384_highest

? ? ? ? 往vector容器頭部插入數(shù)據(jù),所需要的時(shí)間會(huì)隨著容器元素增多而變得很慢。

? ? ? ? 除去vector,其他容器的表現(xiàn)是

insert_begin_16384

? ? ? ? 表現(xiàn)最好的是forward_list、list、deque和unordedset。

? ? ? ? 我們?cè)賹軸變短

元素個(gè)數(shù)<1024

insert_begin_1024_highest

? ? ? ? vector在元素個(gè)數(shù)超過800左右時(shí),性能開始“一騎絕塵”的差。

元素個(gè)數(shù)<256

insert_begin_256_highest

? ? ? ? ?對(duì)于這種小容器,unordered_map最差,其次是unordered_set,然后是multiset和set。

? ? ? ? vector容器只是比上述容器好點(diǎn)。

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

對(duì)比結(jié)果:

? ? ? ? 性能持續(xù)最好的是forward_list、list和deque。

? ? ? ? unordered_set小容器時(shí)表現(xiàn)不是很突出,但是隨著元素增多,性能還是可以的。

? ? ? ? map和unordered_map在小容器時(shí)表現(xiàn)還可以,但是隨著元素增多,性能下降明顯。

? ? ? ? vector在大容器時(shí),表現(xiàn)很糟糕。

中間插入

元素個(gè)數(shù)>15000

insert_mid_16384_highest

? ? ? ? 表現(xiàn)最差的還是vector,其次是unordered_map。

? ? ? ? 除去vector,看看其他容器的表現(xiàn)

insert_mid_16384

? ? ? ? 表現(xiàn)最好的是forward_list和list,然后是set、deque以及multiset。

元素個(gè)數(shù)<4096

insert_mid_4096_highest

? ? ? ? vector大概在元素個(gè)數(shù)超過1500左右時(shí),開始“差”過所有的容器。在此之前,它大部分時(shí)候比unordered_map和set要好。

元素個(gè)數(shù)<256

insert_mid_256_highest

? ? ? ? set容器在元素個(gè)數(shù)超過250左右時(shí),執(zhí)行了高耗時(shí)操作。

? ? ? ? 此時(shí)表現(xiàn)最好的是forward_list、deque。

對(duì)比結(jié)果:

? ? ? ? 持續(xù)表現(xiàn)最好的是forward_list。

? ? ? ? 小容器時(shí),list表現(xiàn)不好。但是元素個(gè)數(shù)超過500左右時(shí),list表現(xiàn)可以媲美forward_list。

? ? ? ? vector容器表現(xiàn)最差。

尾部插入

元素個(gè)數(shù)>15000

insert_end_16384_highest

? ? ? ? 表現(xiàn)最好的是vector。

? ? ? ? 表現(xiàn)最差的是unordered_mutlimap。map表現(xiàn)也不好。

元素個(gè)數(shù)<256

insert_end_256_highest

? ? ? ? 小容器時(shí),表現(xiàn)最好的是vector和forward_list。

對(duì)比結(jié)果:

? ? ? ? vector的表現(xiàn)最好。

結(jié)論:

? ? ? ? vector容器在頭部、中間插入時(shí)性能隨著元素個(gè)數(shù)增多,性能變的非常糟糕。但是在尾部插入場(chǎng)景下,性能是極好的。

? ? ? ? forward_list和deque的插入操作性能在各種場(chǎng)景下,都比較好。

? ? ? ? list容器在頭部和中間插入時(shí),效率很好。但是在尾部插入時(shí),性能不太好。

? ? ? ??文中圖例可從以下地址獲取:https://github.com/f304646673/stl_perf/tree/master/linux

總結(jié)

以上是生活随笔為你收集整理的C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。