首页 > 后端开发 > C++ > 正文

为什么在我的基准测试中迭代 std::vector 比迭代 std::array 更快?

Patricia Arquette
发布: 2024-11-02 03:19:02
原创
242 人浏览过

Why is iterating through std::vector faster than std::array in my benchmark?

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

在之前的基准测试中,假设迭代通过 std::array 比通过 std::vector 迭代要快。然而,基准测试的后续修订表明 std::vector 实际上是更快的选择。本文探讨了这一意外发现背后的原因。

基准改进

改进的基准解决了原始实现中的以下缺陷:

  • 确保循环的结果用于防止优化遗漏。
  • 利用 -O3 标志来增强速度。
  • 使用 std::chrono 将测量仅隔离到 for 循环。

基准测试结果

生成的基准计时表明,与之前的假设相反:

  • std::array:执行时间 = 99.554109 毫秒
  • std::vector: 执行时间 = 30.734491 毫秒

分析

观察到的性能差异源于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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板