向量的初始化很慢
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 秒。
如果有一个向量构造函数将容量作为参数而不实际创建任何元素,那就太好了。这样就可以构建这样一个向量的向量,其中外部向量由空向量组成,每个向量都已经具有必要的容量。以上是关于向量的初始化很慢的主要内容,如果未能解决你的问题,请参考以下文章