首頁  >  文章  >  後端開發  >  為什麼迭代“std::vector”比“std::array”更快?

為什麼迭代“std::vector”比“std::array”更快?

Linda Hamilton
Linda Hamilton原創
2024-11-01 17:18:31754瀏覽

Why is iterating through `std::vector` faster than `std::array`?

命運逆轉:迭代std::vector 優於std::array

與最初的假設相反,最近的基準測試顯示迭代std::vector 比迭代std::array 快得多。這與先前關於數組提供卓越迭代性能的信念相矛盾。

為了確保準確性,基準測試採用了多項改進:

  • 強制結果消耗:非簡單循環用於防止編譯器最佳化消除循環。
  • 使用 -O3 最佳化: 使用最高最佳化等級編譯程式碼以最大化效能。
  • 隔離循環測量: std::chrono 僅用於測量迭代時間,不包括變數初始化。

std::array 和std::vector 的測量時間如下如下:

std::array: 99.554109 milliseconds
std::vector: 30.734491 milliseconds

探究原因

std:: vector 令人驚訝的速度優勢可以歸因於記憶體分頁。此陣列儲存在全域範圍內,最初駐留在執行檔的 .bss 部分中,並且不會被分頁到進程位址空間中。相比之下,std::vector 在建立期間被分配並填零,導致其記憶體頁面存在於記憶體中。

解決問題

至為了公平競爭,人們可以在迭代之前明確初始化數組或將其頁面放入內存。這裡有一個修改,使數組迭代時間與 std::vector:

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

或者,mlock() 函數可用於在 Linux 系統上強制將數組頁放入記憶體。

這項調整顯示 std::array 和 std::vector 之間的效能差異主要源自於它們的記憶體管理策略,凸顯了記憶體存取模式對程式效能的重要性。

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

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