【问题标题】:Why is array considered better than STL containers?为什么数组被认为比 STL 容器更好?
【发布时间】:2016-09-21 15:53:32
【问题描述】:

arraystd::queue,哪个在时间方面更好,为什么?

我编写了一种图处理算法,其中边界顶点存储在std::queue 中,并使用push_back()pop_front() 访问。当我用数组重新实现边界时,前端和结束指针指向边界顶点的开始和结束,我在时间方面得到了更好的结果。对于足够大的数据,数组真的比队列快吗?

【问题讨论】:

  • 您将苹果与橙子进行比较。如果你需要一个队列结构,为什么要使用不是队列的东西?
  • 访问数组和向量中的元素都是 O(1)。如果有的话,时差可以忽略不计。 的不同之处在于向量是动态的,当您向向量添加元素时,它可能需要调整自身大小,包括复制现有数据。那可能很慢。如果您大约知道所需的元素数量,则可以为向量保留该数量,并且速度差会回到几乎为零。如果您想要一个具有编译时固定数量元素的容器,请改用std::array
  • 一个是静态的,另一个是动态的。
  • 这里遗漏了太多细节。您是否进行了优化编译?您使用的数据结构是否提供了比您需要的更多功能?您的代码是否仍然具有同样多的功能?
  • 如果你没有优化编译,问性能是没有意义的。你把编译器的双手绑在背后。这是你改成的动态数组,还是固定大小的?

标签: c++ arrays algorithm graph stl


【解决方案1】:

数组对于大多数机器来说更快,因为数组的连续元素可以加载到同一缓存行中(或根据需要预先加载到缓存中)。由于 L1 缓存读取比主内存访问快 200 倍,因此需要指针获取的任何内容都可能不在缓存中,并且需要更长的主内存获取周期。

https://www.youtube.com/watch?v=YQs6IC-vgmo

【讨论】:

  • std::queue 的实现倾向于分配与缓存行大小。所以区别就在于后续缓存未命中是否是连续的,这通常影响较小。
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2011-04-30
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多