【问题标题】:Profiling and std::vector part of Hot Path? [closed]热路径的分析和 std::vector 部分? [关闭]
【发布时间】:2019-02-17 22:30:32
【问题描述】:

我正在尝试找出我的应用程序出现性能问题的根源。使用 Visual Studio 2017 分析工具,我得到了以下结果:

我对 C++ 比较陌生,所以我不确定 std::vector<bool,std::allocator<bool> >::operator[] 是什么东西,或者这是否真的是我程序的瓶颈。任何帮助表示赞赏。

这是我的代码: https://github.com/k-vekos/GameOfLife/tree/multithread

【问题讨论】:

  • 简短建议:不要使用std::vector<bool>。它针对空间进行了高度优化,而不是针对速度进行了优化。每次调用operator[] 时,都会创建一个新的代理对象。考虑使用其他东西。即使std::vector<uint8_t> 也应该更快。只需将0s 和1s 存储为falsetrue
  • 考虑一下你可以在那里缓存什么,特别是world.size() & world[0].size()。我还会考虑更改std::fmod,很多看似不必要的转换。
  • 还可以考虑使用单个向量而不是向量的向量,您可以自己进行基于坐标的访问,这样可以节省额外的间接层级
  • std::vector<bool,std::allocator<bool> >::operator[] 是您在编写world[newX][newY] 时调用的函数之一。和写world.operator[](newX).operator[](newY)一样
  • @KyleV。 % 或一些 inline 函数。虽然老实说,在查看了% 的性能而不是std::fmod 之后,我仍然希望% 在大多数情况下会更好,但这取决于所使用的特定硬件,所以也许它更像是一个微-优化比我想象的要好。

标签: c++ vector std sfml


【解决方案1】:

在人生游戏中,您所做的是阅读状态来做出决定。可以肯定的是,大部分时间都是这样。

由于您在虚拟地址空间中的标准向量的标准向量,您的访问几乎是随机的。具有跨度向量的单个缓冲区将显着提高内存局部性。

如果您在这些位置保留 0 或 1,则使用 += 而不是分支可能会有所帮助。

bool 的向量也是压缩位;这会使访问速度变慢。使用您的 simpke 算法,单字节向量可能会更快。

请注意,精彩的生活游戏会执行基于区域的散列以在大范围内跳过帧。

【讨论】:

  • “单个缓冲区,带有一个跨度向量,将显着提高内存局部性。”我将如何实现这样的事情?感谢您的帮助!
  • @kyle 寻找 gsl 跨度。 std::vector<unit8_t> data( width*height ); 用于存储。 std::vector<gsl::span<unit8_t>> 访问。 span 是一个指针和一个长度,它覆盖[] 和迭代,看起来有点像一个容器,但它什么都不拥有。
猜你喜欢
  • 2016-12-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2014-12-12
  • 1970-01-01
相关资源
最近更新 更多