为什么迭代 std::vector 比迭代 std::array 更快
在之前的基准测试中,假设迭代通过 std::array 比通过 std::vector 迭代要快。然而,基准测试的后续修订表明 std::vector 实际上是更快的选择。本文探讨了这一意外发现背后的原因。
基准改进
改进的基准解决了原始实现中的以下缺陷:
基准测试结果
生成的基准计时表明,与之前的假设相反:
分析
观察到的性能差异源于std::array 和 std::vector 之间的内存管理差异。对于 std::array,全局范围数组最初存储在可执行文件的 .bss 部分中,该部分驻留在非分页内存中。因此,当第一次访问 std::array 时,内存页面会出错,从而导致性能开销。
相反,std::vector 会分配内存页面并将其零填充创建。这确保了当循环迭代向量时,页面已经存在于内存中。
为了说明这个概念,在主函数的开头添加了一行代码,以将 std 的内存页面添加到内存中。 ::array 进入地址空间:
<code class="cpp">std::fill_n(v.data(), n, 1);</code>
通过预先对页面进行故障处理,std::array 的执行时间会减少到与 std::vector 相匹配。
结论
迭代 std::array 和 std::vector 之间的性能差异源于内存管理机制。对 std::array 页面进行预先故障处理或在支持 mlock 的操作系统上运行程序可以提高 std::array 的性能以匹配 std::vector 的性能。
以上是为什么在我的基准测试中迭代 std::vector 比迭代 std::array 更快?的详细内容。更多信息请关注PHP中文网其他相关文章!