分配std :: vector数组会降低后续计算速度

时间:2012-11-18 06:49:55

标签: c++ vector

我正在优化算法。我遇到了一个奇怪的怪事。

以下内容:

//The following is completely unused
vector<int>** rotated_squares;
rotated_squares = new vector<int>*[31];
for (int i=0;i<31;++i) {
    rotated_squares[i] = new vector<int>[31];
}

{
    //Lots of computation, using other vectors, but not rotated_squares
}

。 。 。至少比以下慢十倍:

{
    //The exact same computation as above.
}

我不知道是什么原因引起的。我唯一能想到的是它是底层实现的工件。为此,使用Visual Studio 2010 for C ++编译器。

编辑:澄清,下面的计算是变慢的部分。在分析时,顶部的内存分配几乎可以忽略不计。

所以问题是我在顶部添加了行,代码运行速度慢了十倍。通过调试,额外的内存分配只需要几分之一秒,但计算代码(通常需要大约8秒)开始需要几分钟。

编辑:根据大众需求,可以在此处找到算法的来源:http://pastebin.com/Yf78gTNC。关键是#if 1可以设置或取消设置,并且代码编译得很好 - 但是使用它,它在计算部分运行得慢得多。

编辑:我已将代码缩减为以下内容:http://pastebin.com/mpnPsQE1。在我的代码中,这会导致问题。但是,制作一个简单的测试用例(即仅使用此代码的主要功能)显示问题。

2 个答案:

答案 0 :(得分:3)

  

我不知道造成这种情况的原因。

vector<const Vec2>** rotated_squares;
rotated_squares = new vector<const Vec2>*[size2[1]]; //size2[1]==31
for (int i=0;i<size2[1];++i) {
    rotated_squares[i] = new vector<const Vec2>[size2[0]]; //size2[0]==31
}

一部分。

答案 1 :(得分:2)

使用C +++ 03和std::vector< T const >,你已经进入了未定义的行为领域。即使使用10分钟拖网标准,我也不确定C ++ 11的情况。但可能是相同的,在这种情况下,不需要特别的解释。

但是,可能是您未显示的代码以及据称放慢速度的代码正在引用rotated_squares

可能还有添加的代码导致缓存未命中。

没有代码就很难重现,但它可能有助于将减速代码放在自己的函数中。

使用ESP电路过载...集中......不,这也不起作用。