首頁  >  文章  >  後端開發  >  為什麼在此基準測試中迭代“std::vector”比“std::array”更快?

為什麼在此基準測試中迭代“std::vector”比“std::array”更快?

Linda Hamilton
Linda Hamilton原創
2024-11-01 14:50:02739瀏覽

Why is Iterating through `std::vector` Faster than `std::array` in This Benchmark?

迭代效能的困惑:std::array vs. std::vector

在先前的查詢中,發現迭代通過std: :array 明顯比透過std::vector 迭代快。為了修正這些有缺陷的觀察結果,設計了一個新的基準,揭示了一個驚人的逆轉:迭代 std::vector 現在明顯更快。

為了避免潛在的最佳化,包含了循環的結果,並且 - O3 標誌已啟用。此外,std::chrono 用於精確計時,隔離循環的執行。

結果是驚人的:

std::array:

$ ./a.out
result: 0
time: 99.554109

std::vector:

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

std::vector >

解開謎團

在檢查Godbolt 中的反彙編後,它變成顯然,效能差異源自於進程位址空間內的記憶體頁面駐留。雖然 std::vector 已經指派並填零,但 std::array 儲存在可執行檔的全域 .bss 部分中,且其頁面尚未分頁。

正在解決問題
std::fill_n(v.data(), n, 1); // included in <algorithm>

要解決此差異,需要將 std::array 頁面放入位址空間。這可以透過在主函數的開頭添加以下行來實現:
mlock(v.data(), v.size() * sizeof(v[0]));

或者,在Linux 上,使用mlock():

結論 此基準測試強調了頁面駐留在迭代效能中的重要性。透過確保 std::array 和 std::vector 的頁面都存在於位址空間中,可以顯著提高迭代效能。

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

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