web-dev-qa-db-ja.com

並列配列を使用してもよいのはいつですか?

私は「並列配列」またはリストと呼ぶものを使用するコード(新しいコード)を実行しています。つまり、関連データを含む2つの配列があり、配列内の位置(インデックス)によってリンクされています。

私はこれを混乱させ、あらゆる種類のエラーを起こしやすいと考えています。私が通常提案する解決策は、フィールドCompanyIdおよびCompanyNameを持つCompanyというオブジェクトを作成することです。

非常に現実的な例:

List<string> companyNames;
List<int> companyIds;

//...They get populated somewhere and we then process

for(var i=0; i<companyNames.Count; i++)
{
    UpdateCompanyName(companyIds[i],companyNames[i]);
}

これらの並列配列は悪い習慣と見なされていますか

14
GER

誰かがparrel配列を使用するかもしれないいくつかの理由はここにあります:

  1. クラスまたは構造体をサポートしない言語で
  2. 個々のスレッドが列の1つだけを変更しているときにスレッドのロックを回避するには
  3. 永続化メソッドによってこれらのものが強制的に個別に格納され、それらを再構成する場合。
  4. 構造体が埋め込まれている場合、メモリの消費量が少なくなります。 (C#のこれらのデータ型には適用されません)
  5. CPUキャッシュを効率的に使用するためにデータの一部を互いに近づけておく必要がある場合(上記のコードでは役に立ちません)。
  6. 単一命令複数データ(SIMD)オペコードの使用。 (このコード、または文字列にはまったく適用されません)

この場合、これを実行するための説得力のある理由は見当たらない...そして、上記のすべてにおそらくより良いオプションがあるか、高級言語ではそれほど有用ではない。

23
TheCatWhisperer

私は 並列配列の使用の罪 をしてきました。時々、あなたは構造に夢中になって、それを抽象化する方法について考えたくないほどです。抽象化はリファクタリングが少し難しい場合があるので、本当に必要なものを証明するまでは、抽象化をすぐに起動することに消極的です。

ただし、詳細を抽象化してリファクタリングすることを検討する価値はあります。多くの場合、私がそれを行うのをためらう最大の理由は、良い名前を考えるのが難しいことです。

並列配列を抽象化する良い方法が見つかれば、毎回そうしてください。しかし、それらに触れることを拒否することによって自分を麻痺させないでください。時には、ちょっとした汚いコードが素晴らしいコードへの最高の足がかりになることがあります。

7
candied_orange

このパターンは Structure of Arrays とも呼ばれ(Array of Structuresとは対照的)、コードをベクトル化するときに非常に役立ちます。 SSEコンパイラ組み込み関数を1つではなく4つの構造で実行するように組み込み関数を使用する以外は、単一の構造で実行してそのビットをベクトル化する計算を作成するのではなく、通常どおり計算を作成します。これは通常は簡単で、ほとんどの場合高速です。SoAフォーマットはこれを非常に自然にします。また、整列を改善し、SSEメモリ操作を高速化します。

6
Dan