0

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

以下:

//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。在我的代码中,这会导致问题。但是,制作一个简单的测试用例(即仅包含此代码的 main 函数)不会显示问题。

4

2 回答 2

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
}

部分。

于 2012-11-18T06:54:27.670 回答
2

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

但是,可能是您未显示的代码(据称速度变慢)正在引用rotated_squares.

也可能是添加的代码导致缓存未命中。

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

让 ESP 电路过载……集中注意力……不,那也没用。

于 2012-11-18T07:22:25.617 回答