首页  >  文章  >  后端开发  >  为什么 std::vector 在迭代中比 std::array 更快?

为什么 std::vector 在迭代中比 std::array 更快?

Linda Hamilton
Linda Hamilton原创
2024-11-02 02:51:30150浏览

Why is std::vector Faster than std::array in Iteration?

通过 std::array 和 std::vector 迭代之间的性能差异

我之前的基准测试,旨在评估以下迭代的性能std::array 和 std::vector 包含一些缺陷。然而,在重新审视这个问题时,我发现 std::vector 实际上比 std::array 更快。

为了减轻优化的潜力,我采用了几种措施,包括:

  • 利用循环的结果来防止编译器优化
  • 使用 -O3 标志进行编译以提高速度
  • 使用 std::chrono 专门测量目标 for 循环

两种数据结构的执行时间如下:

std::array:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 99.554109

std::vector:

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

差异原因:

性能差异源于 std::array 的内存页面未驻留在进程地址中空间。具体来说,全局范围 std::array 驻留在可执行文件的 .bss 部分中,该部分尚未被分页并初始化为零。另一方面,std::vector 已被分配并初始化为零,导致其内存页面已存在于地址空间中。

解决问题:

为了消除此问题并证明两种数据结构之间的奇偶性,可以添加以下代码作为 main 的第一行以引入页面:

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

或者,在 Linux 系统上,一个可以使用 mlock(v.data(), v.size() * sizeof(v[0]));强制页面进入地址空间。请参阅 man mlock 手册页了解更多详细信息。

以上是为什么 std::vector 在迭代中比 std::array 更快?的详细内容。更多信息请关注PHP中文网其他相关文章!

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