首頁 >後端開發 >C++ >為什麼 std::vector 在迭代中比 std::array 更快?

為什麼 std::vector 在迭代中比 std::array 更快?

Linda Hamilton
Linda Hamilton原創
2024-11-02 02:51:30221瀏覽

Why is std::vector Faster than std::array in Iteration?

透過std::array 和std::vector 迭代之間的效能差異

我之前的基準測試,旨在評估以下迭代的性能std::array 和std::vector 包含一些缺陷。然而,在重新審視這個問題時,我發現 std::vector 實際上比 std::array 更快。

為了減輕最佳化的潛力,我採用了幾種措施,包括:

  • 利用循環的結果來防止編譯器最佳化
  • 使用-O3 標誌進行編譯以提高速度
  • 使用std::chrono 專門測量目標for 循環

兩種資料結構的執行時間如下:

std:: array:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 99.554109

std::vector:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 30.734491

差異原因:

性能差異源自於std::array 的記憶體頁面未駐留在進程位址中空間。具體來說,全域範圍 std::array 駐留在可執行檔的 .bss 部分中,該部分尚未被分頁並初始化為零。另一方面,std::vector 已被分配並初始化為零,導致其記憶體頁面已存在於位址空間中。

解決問題:

為了消除此問題並證明兩種資料結構之間的奇偶性,可以添加以下程式碼作為main 的第一行以引入頁面:

<code class="cpp">std::fill_n(v.data(), n, 1); // included in <algorithm></code>

或者,在Linux 系統上,一個可以使用mlock(v.data(), v.size() * sizeof(v[0]));強制頁面進入位址空間。請參閱 man mlock 手冊頁以了解更多詳細資訊。

以上是為什麼 std::vector 在迭代中比 std::array 更快?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn