C++中為什麼vector的讀寫速度比原生數組快?

之前在網上看到的結論都是vector比原生數組略慢一點,即便是加上了編譯優化。直到自己試了一下,結果vector的讀寫速度比原生數組要快很多。

測試結果大致是這樣:

我測試了幾遍,GCC和clang表現差不多

代碼如下:

#include &
#include &
#include &
#include &
using namespace std;

#define LOOP 100000UL

int main() {
cout.sync_with_stdio(false);

decltype(chrono::high_resolution_clock::now()) start;
decltype(start) end;
long long ticks;

array& stdarr;
start = chrono::high_resolution_clock::now();

for (unsigned long i = 0; i != LOOP; i++) { stdarr[i] = i - 1; } // for

end = chrono::high_resolution_clock::now();
ticks = chrono::duration_cast&(end - start).count();

cout &<&< stdarr[2334UL] &<&< endl; cout &<&< "STD::ARRAY: " &<&< ticks &<&< " microseconds." &<&< endl; vector& vec(LOOP);
start = chrono::high_resolution_clock::now();

for (unsigned long i = 0; i != LOOP; i++) { vec[i] = i - 1; } // for

end = chrono::high_resolution_clock::now();
ticks = chrono::duration_cast&(end - start).count();

cout &<&< vec[2334UL] &<&< endl; cout &<&< "STD::VECTOR: " &<&< ticks &<&< " microseconds." &<&< endl; unsigned long arr[LOOP]; start = chrono::high_resolution_clock::now(); for (unsigned long i = 0; i != LOOP; i++) { arr[i] = i - 1; } end = chrono::high_resolution_clock::now(); ticks = chrono::duration_cast&(end - start).count();

cout &<&< arr[2334UL] &<&< endl; cout &<&< "ARRAY: " &<&< ticks &<&< " microseconds." &<&< endl; return 0; } // function main

這是優化的原因還是我這裡特殊情況......

或者說測試代碼中有問題?

我的系統是Ubuntu 14.04 LTS,CPU是i7-4790

===============================分割線===============================

確實如@Wang Shuai 所說,把數組的值初始化為0,速度就一樣了


因為vector的構造函數會把每個元素初始化一遍,所以後面的訪問cache命中就比另外兩個高。

你如果在stdarr的定義和start = now之間加一句fill(stdarr.begin(), stdarr.end(), 0)那麼它就和vector速度一樣了, 原生數組同理。


Windows 7,VS 2015的開優化運行結果,反而是後兩者幾乎一樣,第一個慢將近一倍。(話說你的CPU那麼強了為什麼兩個數組的結果那麼慢?)

@riteme 我懷疑你的編譯器只針對vector做了auto-vectorization優化(放入XMM寄存器),查查反彙編結果看看。我的反彙編三種都基本相同,而且StdArray和PlainArray反彙編一模一樣,但是結果差一倍,我懷疑是內存對齊的問題。

更新:

找到原因了。將std::array和array都用new分配到heap上,三者的運行結果完全一樣。


release版本結果,誰能解釋一下?

debug版本結果?

我老感覺上面的回答都是蝦扯蛋


推薦閱讀:

有沒有簡單一點的Python小例子小項目?
如何用通俗易懂的語言解釋《Flask 框架作者希望看到的 Python》到底在說什麼?
離散數學中的閉包和計算機語言中的閉包有聯繫嗎?
程序員內心的強大有哪些體現?

TAG:編程 | C | CC | 計算機語言 | C標準 |