迭代效能的困惑: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.734491std::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中文網其他相關文章!