【问题标题】:Performance implications of using a list of vectors versus a vector of vectors when appending in parallel并行附加时使用向量列表与向量向量的性能影响
【发布时间】:2014-05-03 11:41:21
【问题描述】:

一般来说,在附加简单类型时,向量似乎优于列表,例如here

如果我想用简单类型填充矩阵怎么办?每个向量都是一列,所以我将遍历外部向量,并在每个向量上重复添加一项。

当前面的向量增加它们的保留空间时,是否总是必须移动外部向量的后面的向量?就像整个数据在一个连续的空间中一样?还是所有向量都只保存一个指向它们各自内存区域的指针,因此即使单个向量增长,外部向量的内存大小也保持不变?

【问题讨论】:

  • 不,它们不必被移动。多维动态数组保存在非连续空间中。
  • “或者所有向量都只是保存一个指向它们各自内存区域的指针,因此即使单个向量增长,外部向量的内存大小也保持不变?”。正是

标签: c++ list vector stl


【解决方案1】:

取自 cmets,看来可以愉快地使用向量的向量。

【讨论】:

  • 如果我能提供一条建议。在遇到代码运行缓慢的问题之前,不要担心向量类重新复制数据的效率。连续数据的复制非常快。我最近一直在将我的许多 2D 向量转换为包装器类中的 1D 向量,以强制它们连续以获得性能提升。除非您不断地从大量向量的内部区域插入/删除,否则不太可能产生任何负面影响。
  • 是的,向量的向量很好。仅当您附加另一列时,向量的向量才会(很可能)增长,即。另一个向量。
【解决方案2】:

对于中小型应用程序,向量的效率很少需要担心。

您可能会担心一些情况,但它们并不常见。

class CData {};  // define this
typedef std::vector<CData> Column;
typedef std::vector<Column> Table;

Table tab;

要添加新行,您将向每一列追加一个项目。在最坏的情况下,您可能会导致重新分配每一列。这可能是一个问题如果 CData 非常复杂,并且列当前包含大量 CData 单元格(我会说至少有成千上万个)

同样,如果您添加一个新列并强制表向量重新分配,它可能必须复制每一列,并且对于非常大的数据集,这可能会有点慢。

但是,请注意,新式编译器可能能够将旧表中的列 move 转换为新表(而不是 copying 它们),这使得速度非常快。

正如@kkuryllo 在评论中所说,一般不用担心。

努力使您的代码尽可能干净、简单和正确。只有在分析揭示了性能问题时,您才应该担心优化速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2014-02-08
    • 2021-01-13
    • 2015-03-31
    • 2011-08-11
    相关资源
    最近更新 更多