在并行追加时,使用向量列表和向量的向量对性能的影响
Performance implications of using a list of vectors versus a vector of vectors when appending in parallel
似乎在一般情况下,当附加简单类型时,向量比列表更受欢迎,参见这里的示例。
如果我想用简单类型填充一个矩阵呢?每个向量都是一列,所以我要遍历外部向量,并在每个向量上重复添加1项。
当前面的向量增加其保留空间时,外部向量的后面的向量是否总是必须移动?所有的数据都在一个连续空间里吗?还是所有的向量都只持有一个指向它们各自内存区域的指针,所以即使单个向量增长,外部向量的内存大小也保持不变?
从评论来看,向量的向量似乎可以很好地使用。
对于中小型应用,很少需要担心矢量的效率。
有几种情况你可能会担心,但它们并不常见。
class CData {}; // define this
typedef std::vector<CData> Column;
typedef std::vector<Column> Table;
Table tab;
要添加新行,将在每列上附加一个项。在最坏的情况下,您可能会导致每个列的重新分配。这可能是一个问题,如果 CData是非常复杂的,列目前持有非常大量的CData单元格(我想说,成千上万,至少)
同样,如果您添加一个新列并强制表向量重新分配,它可能必须复制每个列,并且对于非常大的数据集,这可能会有点慢。
但是,请注意,新编译器可能能够将旧表中的列move
到新表中(而不是将它们copy
),从而使其非常快。正如@kkuryllo在评论中所说,这通常没什么好担心的。
努力使你的代码尽可能干净、简单和正确。只有当性能分析揭示了性能问题时,您才应该担心优化速度。
相关文章:
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 如何在C++中声明抽象类的向量列表?
- 创建以向量/列表迭代器为键的映射
- 如何在不以不同方式创建每个向量的情况下制作 2-D 向量列表?
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- 根据优先级对向量列表进行字典式排序
- SIGBART 错误向量<列表<myClass>>
- C++向量列表
- 基本STL:向量列表或列表向量,在这种特殊情况下哪个会更好
- 通过 JNI 传递、返回和转换为向量列表列表
- C++:向量中向量列表的有效复制
- 从向量列表调用成员函数指针
- 多类型容器(数组/向量/列表)传统上是如何在C++实现的?(当然没有元组)
- 从向量列表c++中删除一个向量元素
- 向量列表(c++)
- 从整数向量列表中删除重复项的快速方法
- 初始化动态向量列表
- 当输出向量列表时,输出的量是平方的
- 在并行追加时,使用向量列表和向量的向量对性能的影响
- 在向量/列表中,您是否真的将其应用于对象?(C++)