深入研究 C++中的 STL Deque 容器 實驗四—— vector::insert() 和 deque::insert() 執(zhí)行特點比較 目的 deque主張使用參數(shù)為常量的insert(),。但怎么樣能和vector::insert()比較一下呢,?本實驗的目的就是比較一下vector::insert()> 和 deque::insert()的工作特點。 描述 在容器的容器多次插入數(shù)據(jù),,在這里可能不符合你的需求,,既然這樣你可以使用insert(),試驗代碼也和實驗一基本一樣,,使用insert()代替push_back(),,使用insert(>)來測試。 結(jié)果 當(dāng)插入常量給deque的時候,,從下圖可以看出和vector的對比來,。 注意兩張圖片中時間軸的不同,這是將>61810個數(shù)據(jù)插入到容器中,。 實驗五——讀取容器的性能 目的 這個實驗將測試vector::at(),vector::operator[],deque::at()和deque::operator[]的性能,。首先應(yīng)該是operator[]比at()效率要高,因為它不進行邊界檢查,,同時也比較vector和deque。 描述 這個實驗將測試中的容器有1000000個類型為std::string,,每個字符串長度為1024的數(shù)據(jù),,分別使用at()和operator[]這兩個操作來訪問容器容器的數(shù)據(jù),測試它們運行的時間,,這個測試執(zhí)行50次,,統(tǒng)計每次執(zhí)行的結(jié)果,。 結(jié)果 我們看到使用vector和deque訪問容器中的數(shù)據(jù),他們執(zhí)行的性能差別很小,,使用operator[]和at()訪問數(shù)據(jù)的性能差別幾乎可以忽略不計,,下面是統(tǒng)計的結(jié)果:
結(jié)論 在這篇文章中我們覆蓋了多種不同的情況來選擇我們到底是該使用vector還是deque。讓我們總結(jié)一下測試的結(jié)果看下面幾個結(jié)論,。 當(dāng)執(zhí)行大數(shù)據(jù)量的調(diào)用push_back()的時候,,記住要調(diào)用vector::reserve()。 在實驗一中我們研究了vector和deque在插入數(shù)據(jù)的情況,。通過這些假設(shè),,我們可以看出deque分配的空間是預(yù)先分配好的,deque維持一個固定增長率,,在vector實驗中我們考慮到應(yīng)該調(diào)用vecor::reserve()>.然后在下面這個例子驗證了我們的假設(shè),,在使用vector的時候調(diào)用reserve()能夠膀子我們預(yù)先分配空間,這將是vector一個默認選擇的操作,。 當(dāng)你分配很多內(nèi)存單元的時候,,記住使用deque回收內(nèi)存要比vector消耗時間多。 在實驗三中我們探討了vector和deque在回收非鄰接內(nèi)存塊上的不同,,分別證明了vector在分配內(nèi)存的時候是線性增長,,而deque是指數(shù)增長,同樣,,vector要回收的內(nèi)存比deque多的多,,如果你循環(huán)調(diào)用了push_back(),那么deque將獲取大量的內(nèi)存,,而且是臨近的,。我們通過測試發(fā)現(xiàn)在分配內(nèi)存單元消耗的時間和vector的時間接近。 如果你計劃使用insert(),,或者需要pop_front(),,那就使用deque。 由于vector沒有提供pop_front()函數(shù),,但在實驗四的結(jié)果中可以看出沒有insert()是非常好的,,同時也告訴我們?yōu)槭裁磀eque在STL類中要作為單獨的一個類劃分出來。 對于訪問數(shù)據(jù),,vector::at()效率最高,。 在實驗五中統(tǒng)計的數(shù)據(jù)表示,所有訪問數(shù)據(jù)方法的效率是非常接近的,,但是vector::at()效率最高,。這是因為最優(yōu)的平衡圖訪問時間為最低的六個西格瑪值。 最后 我希望本文能夠帶你認識deque,,而且對它感興趣或者一個啟發(fā),,歡迎繼續(xù)討論關(guān)于vector和deque任何問題和內(nèi)容,。 |
|