向量的初始化很慢

Posted

技术标签:

【中文标题】向量的初始化很慢【英文标题】:Initialization of vector of vector is very slow 【发布时间】:2011-06-21 11:43:52 【问题描述】:

我有一个向量向量,我正在尝试按如下方式对其进行初始化:

vector<vector<float> > matrix(numberOfRows, vector<float> (numberOfCols));

但这一行大约持续 0.89,其中 numberOfRows 和 numberOfCols 是:

const uint32_t numRows = 10000;
const uint32_t numCols = 20000;

而使用以下代码初始化动态数组需要 0.04 秒来执行:

float **matrix = new float*[numberOfRows];
for (size_t i = 0; i < numberOfRows; ++i)
    matrix[i] = new float[numberOfCols];

我做错了什么有没有更快的方法来初始化那个向量?

编辑:

至于问题:

我使用 g++-4.5 测试使用 O3 优化级别和默认标准。

【问题讨论】:

什么编译器,你正在编译优化? 您使用的是哪个版本的 C++ 标准? 分配一大块而不是 10000 个较小的块,您可能会看到一些改进。请注意,在 32 位 Windows 中,您将无法容纳超过两个(或三个具有特殊配置的)。它 【参考方案1】:

不同之处在于向量被初始化为零,而动态数组不是。有 2 亿个值,这是值得注意的。

您可以选择延迟向量行的初始化,直到您有真正的值来分配它们,方法是不扩展初始化中的列。

【讨论】:

恐怕延迟初始化可能会造成分配瓶颈。 @systemsfault - 如果需要,您可以通过为每一行调用 reserve(numberOfCols) 为每一行保留空间。如果您从其他容器分配每一行,它将自行修复。这取决于您如何使用矩阵。 感谢 Bo,您是对的,将初始化时间降至 0.05 秒。 如果有一个向量构造函数将容量作为参数而不实际创建任何元素,那就太好了。这样就可以构建这样一个向量的向量,其中外部向量由空向量组成,每个向量都已经具有必要的容量。

以上是关于向量的初始化很慢的主要内容,如果未能解决你的问题,请参考以下文章

MappedByteBuffer 在初始运行时很慢

用向量的向量的元素初始化向量的空向量

初始化向量向量

初始聚合物加载时间本身就很慢

在定义的位置初始化向量向量 - C++

初始化用户定义的向量的向量