矩阵/矢量初始化性能



这更多的是一个教育问题,我没有试图解决的具体问题。我想了解一下会发生什么";"幕后";在以下场景中:

我们有两个ints,wh,我们需要一个0s的矩阵(vector<vector<int>>(。有多种方法可以做到这一点,我想知道哪一种表现最好(可能意味着哪一种拷贝最少(。

选项1:

vector<vector<int>> m;
for (int i = 0; i < h; i++)
{
m.push_back(vector<int>());
for (j = 0; j < w; j++)
m[i].push_back(0);
}

选项2:

vector<vector<int>> m;
for (int i = 0; i < h; i++)
m.push_back(vector<int>(w, 0));

选项3:

vector<vector<int>> m(h, vector<int>(w, 0));

m.push_back(vector<int>());/m.push_back(vector<int>(w, 0));处的临时值是否在内存中创建,然后也复制到m中?如果是这样,使用选项1来尽量减少复制不是更好吗?(假设我们只讨论更大的数组,比如1000000 x 1000000(。备选方案3也面临同样的困境;哪个往往更快(至少在纸面上(,为什么会更快?

如果想要Matrix类的性能,首先不要使用std::vector<std::vector<T>>。您编写了一个适当的类来封装一维std::vector<T>。向量中的一个向量在内存中是分段的。

如今,在商业硬件上,一万亿元素的矩阵在技术上是可能的,但要初始化它,你真的非常想要多个线程。这是对你的3个例子的另一个实际反对意见。

话虽如此,对于小型实验,所有的代码都很好。

最新更新