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++)——插入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bug诞生记——隐蔽的指针偏移计算导致的
- 下一篇: C++拾趣——STL容器的插入、删除、遍