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
}

。。。少なくとも10倍遅い:

{
    //The exact same computation as above.
}

何が原因なのかわかりません。私が考えることができる唯一のことは、それが何らかの形で基礎となる実装のアーティファクトであるということです。そのために、Visual Studio 2010 forC++コンパイラを使用します。

編集:明確化、以下の計算は遅くなる部分です。プロファイリングの場合、上部のメモリ割り当てはほとんど無視できます。

したがって、問題は、上部に行を追加すると、コードの実行速度が約10倍遅くなることです。デバッグにより、追加のメモリ割り当てには数分の1秒かかりますが、通常は約8秒かかる計算コードは、数分かかり始めます。

編集:一般的な需要により、アルゴリズムのソースはここで見つけることができます:http: //pastebin.com/Yf78gTNC。重要なのは、#if 1を設定または設定解除でき、コードが正常にコンパイルされることです。ただし、これを使用すると、計算セクションでの実行速度が大幅に低下します。

編集:私はコードを次のように減らしました:http://pastebin.com/mpnPsQE1。私のコードでは、これが問題の原因です。ただし、単純なテストケース(つまり、このコードだけを使用したメイン関数)を作成しても、問題は発生しません。

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 を使用すると、std::vector< T const >未定義の動作の土地に渡されます。標準を10分間トロールした後でも、C++ 11の状況はわかりません。しかし、おそらく同じであり、その場合、特別な説明は必要ありません。

ただし、表示されていない、速度が低下しているとされるコードが を参照している可能性がありますrotated_squares

また、追加されたコードによってキャッシュ ミスが発生する可能性もあります。

コードなしで再現するのはかなり難しいですが、スローダウンしたコードを独自の関数に入れると役立つ場合があります。

ESP 回路のオーバードライブを使用中… 集中中… いいえ、それもうまくいきませんでした。

于 2012-11-18T07:22:25.617 に答える