【问题标题】:Standard vector and boost array: which is faster?标准向量和提升数组:哪个更快?
【发布时间】:2011-06-27 01:29:03
【问题描述】:

boost::array 的性能与std::vector 相比如何,哪些因素对其有显着影响?

【问题讨论】:

  • 我怀疑这可能是您应用程序的瓶颈。
  • @Benoit。我在做科学计算,速度对它很重要。
  • @Roman:那你应该知道要配置文件了。
  • @Roman,一个是有编译时间限制的,另一个可以根据需要灵活增长——你需要哪个?
  • @Benoit A boost::array 可以静态或动态分配(即在堆栈上或堆上)。 std::vector 的存储总是动态分配的,即使向量是静态分配的。

标签: c++ arrays boost stl vector


【解决方案1】:

boost::array(或 C++0x 的std::array)应该比std::vector 快,因为boost::array 实例完全在堆栈上。这意味着boost::array 没有堆分配,这也意味着它不能增长到超过您在构造时为其指定的大小。

boost::array 的目的是充当原始数组周围的薄层,因此您可以将它们视为具有.begin().end() 等的标准容器。好的编译器应该消除boost::array 的所有开销,这样它的性能与原始数组相同。


所有这些都与“默认”设置有关,您没有自定义分配器,您可以测量简单的事情,如数组构造、元素的访问和修改。另一方面,在其他测试、其他平台或通过巧妙的设置,情况可能会好转。例如,

  • 如果您创建一个自定义分配器,可能在程序启动时获得一个大内存池,那么构建或调整std::vector 的大小可能不再那么昂贵了。
  • 用另一个std::vector 交换通常是一个非常快速的操作;交换两个指针的速度。交换两个boost::array 实例可能要贵得多;按照复制n 元素的顺序。但是,在 C++0x 中,std::array 将成为其中的一部分,由于右值引用及其移动语义,交换两个数组将再次变得很快。
  • 复制向量可能是一个非常快的操作;与复制指针一样快(写入时复制)。复制 boost::array 可能需要复制每个数组元素。再说一次,有时复制任何对象都非常快,甚至比复制指针甚至在 C++03 编译器中还要快——这要归功于复制省略。

您可以分析以查看哪个更快适合您的使用,但即使是此测试也只能让您了解特定平台上特定编译器的特定版本。

【讨论】:

  • 听起来你不能使用 boost::array 来处理大数组。否则,您将面临堆栈溢出的风险。对吗?
  • 如果你在堆栈上分配它,@Ypnos,那么是的,你可以预期堆栈溢出(或编译器错误,如果编译器不允许超过特定大小的类型)。如果你动态分配,那么你不应该得到堆栈溢出,除非你错误地按值传递数组。 (但是无论你在哪里分配值,编译器错误仍然是一个风险。)
  • 在什么方面更快?最初的问题充其量是模糊的。他是指数组/向量成员的访问,还是指填充/分配相同的工作?
  • @JonTrauntvein 我陈述了我的假设。
  • 在我看来,给出一个带有陈述假设的答案来回答“这取决于”并停在那里会更有帮助。
【解决方案2】:

得出任何结论的最佳方法是编写程序以使用大量数据测试其性能。否则如何得出任何结论?

当您使用它时,您可能需要一些工具来帮助您,例如VTuneAMD CodeAnalyst Performance Analyzer 等。Very Sleepy(免费工具)是适用于 Windows 系统的 C/C++ CPU 分析器。你可以试试看!

【讨论】:

  • 嘿,非常困是一个不错的小工具! (我更正了它的链接。)
【解决方案3】:

在什么方面更快? std::vector 的输入速度更快,因为它少了一个字符。

哪个更快并不重要,你是在比较两个不同的东西,一个静态大小的数组和一个动态大小的数组。使用哪个取决于您的应用程序,与速度无关。

您想驾驶飞机或汽车前往某个地方吗?这取决于比哪个更“更快”。


boost::array 的分配速度可能更快,因为它在典型机器上位于堆栈上。或者 std::vector 可能由于某些自定义内存分配方案而几乎一样快。

但这只是分配。怎么用?好吧,两者都只是数组的索引,所以可能没有区别。但是移动或交换呢? boost::array 当然不能这么快,因为std::vector 只需要移动/交换一个指针。或许没有,谁知道呢?

您必须分析并查看程序集。没有人能神奇地知道事情对你的影响。

【讨论】:

  • 如果您有大量数据要处理,分配std::vector 所花费的时间很容易被迭代分配的内容所占用的时间所淹没。特别是如果您开始对数据进行多次传递。
【解决方案4】:

arrayvector 的用途略有不同。如果您将vector 初始化为您需要的大小并且永远不会重新分配,则两者之间的性能是相同的。 array 仅处理静态大小的数组(如果您愿意,可以使用 C 样式数组)。 vector 可以增长,如果你将更多的对象推入容器而不是它当前的容量。

【讨论】:

  • 由于向量需要通过指针访问底层数据,因此数组可能会稍微有性能优势,因为向量访问必须经过一层间接层。我怀疑这是一个值得在现代硬件上考虑的因素,除非在极端情况下。
  • 他说的不是C风格的数组,他指的是std::array(又名boost::array)模板类,它具有与向量相同的重定向性能“命中”(两者都如此微小,无论如何都没关系)。
猜你喜欢
  • 2015-06-21
  • 1970-01-01
  • 2011-12-07
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多