1

構造体のセットの配列を処理する最も効率的な方法を見つけようとしています。つまり、現時点では、次の構造を取得しています。

struct myStruct{
    double p1;
    double p2;
    bool p3;
    double w;
}

そのため、モデリングするオブジェクトには 3 つのプロパティとそれらに割り当てられた重みがあります。現在、これらは固定サイズ (たとえば 10) の配列に配置されており、オブジェクトの重みの複数の組み合わせ (たとえば 1000) があります。

const int nObj = 10;
const int n = 1000;

myStruct comb[n][nObj];

最後に、サイズが 10 の配列を渡す関数がいくつかあります。

double evalComb(myStruct (&ms)[nObj], double q1, double q2){
    double output = 0;
    for(int i = 0; i < nObj; i++){
        output += // calculate some stuff using p1,p2,p3,w and other params
    }
    return output;
};

ここでの問題は、 , , の 10 個の値のセットがp11000p2p3の組み合わせすべてで固定されていることです (const は除く)。変更されるのは 10 個の weights のセットだけですw。この種のことは、1000回すべてをコピーするのはメモリの無駄だと思います...私は動作するコードを持っていますが、それをより速くしたいと思っています.その関数は何百万回も呼び出され、時間の 90% はそこに費やされます)。構造体から重みを取得し、構造体の 1 次元配列を残して 2 次元の二重配列を作成する方がよいでしょうか? これは、別の配列パラメーターが関数に渡されることを意味しますが、速度が低下しませんか? たぶん、代わりに配列を含む構造体が必要ですか?これで発生する可能性のある他の問題はありますか?

4

3 に答える 3

1

私が提案するのは、変更されないもののために、3 つの静的メンバーを持つ double を含むクラスを持つことです。

struct myStruct{
    static std::array<double,10> p1;
    static std::array<double,10> p2;
    static std::array<bool,10> p3;
    double w;
}  

このようにして、スペースを節約し、他の 3 つの変数に簡単にアクセスできます。IMO は、変数間の関連付けを保持し、変更する機会を与えるため、単に double の配列を使用するのではなく、クラスを保持することをお勧めします。クラスは後で。クラスは、特に最新のコンパイラでは、思ったほどオーバーヘッドを引き起こしません。

変更されない場合は、静的変数を const にすることもできます。

于 2013-08-05T00:36:59.773 に答える
0

100 程度のすべての構造でメンバーが同じ (共通) である場合はp1, p2, p3、設計の変更を提案したいと思います。プロパティの新しいクラス/構造を作成します

struct myProperties {
    // TODO: define c'tor
    double p1;
    double p2;
    bool p3;
};

struct myStruct {
      myStruct(myProperties *properties_): properties(properties_) {}
      myProperties properties;
      // TODO: define getters for p1, p2, p3
};

同じプロパティを持つグループを作成するときは、目的のプロパティを持つオブジェクトmyStructへのポインタを渡しますmyProperties

myProperties m(p1, p2, p3); 
myStruct s(&m);

このようにして、1 つのプロパティ グループを100 個(p1, p2, p3)のオブジェクトの 1 つのグループに割り当て、別のプロパティ グループを他の1000 個のオブジェクトに割り当てることができます (これは静的メンバーでは実現できません)。 myStruct myStruct

于 2013-08-05T03:12:28.363 に答える
0

p1、p2、および p3 の 10 個の値がまったく変わらない場合は、定数にするか #define を使用します。コンパイラがメソッド定義または関数定義でそれらをリテラルと交換すると、パフォーマンスが向上します。この場合の「オブジェクト」は、w の 10 個の double の配列になります。w を 1000 X 10 の配列として宣言して、メモリを連続したブロックに割り当てておくことも検討してください。これにより、構造体でメモリアドレスが整列されていない変数タイプを混在させるよりもパフォーマンスが向上します。

于 2013-08-05T01:17:56.217 に答える