1

倍精度浮動小数点数の配列に対して非常に高速に (ほとんどの場合マルチスレッドで) 計算を実行できる外部ライブラリがあるとします。便宜上、コードをオブジェクト指向の方法で記述して、オブジェクトの配列を取得します。各オブジェクトには、double 値を保持するプロパティがあります。強力な外部ライブラリを利用する単純なアプローチは、次のようなものです。

double temp[N];
for i from 1 to N
   temp[i] = objectArray[i].property;
end

ただし、これには一時配列を保持するための時間と追加のメモリが必要です。それを行うより良い方法はありますか?

一般的な質問ですが、基本的にはC++でやりたいです。

4

2 に答える 2

1

オブジェクトにアリーナ戦略を使用できます。基本的に、オブジェクトにはデータ アリーナへのインデックスとハンドルのみが含まれます。実際のデータは、アリーナの右側のインデックスに格納されます。このように double のベクトルを作成する必要がある場合、それはすでにアリーナ内に存在します。

これは、一緒に処理されるオブジェクトが常にわかっている場合にのみ機能し、ほとんどの場合一緒に処理されます。必要なオブジェクトを毎回選択する必要がある場合、これによってパフォーマンスが向上することはありません (オブジェクトが配列内で常に連続している場合を除きます)。これにより、通常のオブジェクトへのアクセスが少し遅くなるため、毎回値をコピーすることが実際にプログラムのボトルネックである場合にのみ意味があります。

データ構造は次のようになります。

class Arena {
   vector<double> propertyX;
   vector<double> propertyY;
   int next_index;
};

class MyObject {
  int index;
  Arena& arena
  MyObject(Arena& arena_ref): arena(arena_ref) { index = arena.next_index++; }
  double getX() { return arena.propertyX[index]; }
};

物事が割り当てられていることなどを確認するには、もう少しコードが必要ですが、アイデアは得られます。外部ライブラリを呼び出す必要がある場合は、Arenaオブジェクトから直接配列を取得します。

于 2016-04-26T08:15:09.043 に答える