迭代性能的困惑: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
解开谜团
在检查 Godbolt 中的反汇编后,它变成显然,性能差异源于进程地址空间内的内存页面驻留。虽然 std::vector 已经分配并填零,但 std::array 存储在可执行文件的全局 .bss 部分中,并且其页面尚未分页。
正在解决问题
要解决此差异,需要将 std::array 页面放入地址空间。这可以通过在主函数的开头添加以下行来实现:
std::fill_n(v.data(), n, 1); // included in <algorithm>
或者,在 Linux 上,使用 mlock():
mlock(v.data(), v.size() * sizeof(v[0]));
结论
该基准测试强调了页面驻留在迭代性能中的重要性。通过确保 std::array 和 std::vector 的页面都存在于地址空间中,可以显着提高迭代性能。
以上是为什么在此基准测试中迭代'std::vector”比'std::array”更快?的详细内容。更多信息请关注PHP中文网其他相关文章!