首页  >  文章  >  后端开发  >  为什么在此基准测试中迭代“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

解开谜团

在检查 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn