任意のSQL行を読み込むときにボクシングメモリのオーバーヘッド - アンボクシングを防ぐ方法

StackOverflow https://stackoverflow.com/questions/1842838

  •  12-09-2019
  •  | 
  •  

質問

私は、SQLクエリから行を表すためにクラスを書いています。私は、フィールドのデータはクラスのインデクサプロパティを介してアクセスすることにしたいです。私は、オブジェクトの内部リストにデータをロードする場合、これは十分に簡単です。私はすでにこれを試してみましたが、プリミティブのボクシングと満足していないました。ボクシングは20%メモリ要件を増加させます。私は、クラス内のプリミティブとしてプリミティブを保存したいと思います。データテーブルクラスがたIDataReaderから返されたスキーマ内の各列のアレイを作成することにより、プリミティブを記憶します。私は、クラスをこのように実装され、私は、行によって内部的に参照されている列ではなく行オブジェクトに格納されたデータを好むだろう。

これを達成する上の任意のアイデア?

役に立ちましたか?

解決

あなたが行を表す構造タイプを生成することができます。これは、動的に行うことができ、任意のボクシングがありませんので、それを行うことが可能です。私はそれが努力の価値があることを確認していない

他のヒント

わずか20%のオーバーヘッド?幸運ですね!私はちょうどそれが(余分なメモリの影響を除く)fourty倍の性能低下を追加したいくつかのコードをクリーンアップ!とにかく、objectを使用しないようにする典型的な方法は、ジェネリックを使用して開始することです。ここでは単純化した例があります:

class RowRepresenter<T>
{
    //....
    public T this[int index] {get; set;}  // implementation left out
}

// initialize, suppose the properties (indexers) should be ints:
RowRepresenter<int> myInstance = new RowRepresenter<int>();
myInstance.LoadData();

// get data (i.e., your indexer)
int somefield = myInstance[2];   // no overhead, no casting required
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top