【问题标题】: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 中,您将无法容纳超过两个(或三个具有特殊配置的)。它

标签: c++ performance vector initialization


【解决方案1】:

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

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

【讨论】:

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