2009-03-30 6 views
10

多数のアイテムを持つ.NETコレクションは、LOHに格納されやすいのですか?.NETコレクションとラージオブジェクトヒープ(LOH)

私は特にリストと辞書について興味があります。私のコードでは、比較的小さなオブジェクト(40k +)を一時的なリストと辞書に格納して処理します。これらのコレクションのアイテムの数は、LOHに入れられる可能性を高めますか?

Listは、Listが二重リンクリストとして実装されていると仮定すると、実際のListオブジェクトのサイズを増やすべきではありませんが、確かに知りたいと思います。

おかげ

答えて

13

オブジェクトは、85,000バイトを超える場合にのみLOHに格納されます。大きなリスト(特に構造体のリスト)は、しばしばここに割り当てられます。

しかし、ディクショナリはバケットの配列を格納している可能性が低いので、配列が> 85000バイトになるような十分なバケットを生成しない限り、ほとんどありません。 40k要素のリストは、たとえクラスであってもLOHに格納されます(各要素のオブジェクト参照によりリストがx86では160k、x64システムでは320kになるため)。しかし、個々の要素は標準ヒープになりますので、圧縮されます。

標準リストの代わりに二重リンクリストを使用している場合、LOHに格納されることはほとんどありません。リストの各要素は小さくなります(次の/前のノードへの参照を持つただ1つのノード)ので、単一のオブジェクトは> 85kバイトになりません。 LOHの詳細については

+ 40Kであなたはかなり安全オブジェクトので、this is a great blog entry.

+0

8バイト境界でアライドされた方が高速であるため、倍精度の配列には下限があります。 –

+2

辞書の実装は、合体ハッシュテーブル(連鎖ですが配列を使用します)連鎖されたバケットを格納するために、キャッシュの使用に関する限りオープンなアドレッシングの利点を得るため)、40kでは内部配列40000 *(keysize + valuesize + 8 [hashcodeをメモするint 1つはチェーン内に次のインデックスを格納する])と40000 * 4(intサイズ)の内部配列です。それはあらかじめ計算された素数を使用するので、40000は実際には少なくとも43627、おそらくは90523になります。 ... –

+1

...少なくとも1つの436270バイトの配列(キーと値が両方ともバイトサイズで、他のサイズであれば)、少なくとも1つの174508バイトのインデックスの配列。したがって、40kの要素辞書は**常に** LOH内の内部表現の一部を持っています(辞書自体は40-80バイトのように、世代のヒープの1つでサイズに関係なく)。 –

4

System.Collections.Generic.Listは内部の配列ではなく、リンクリストとして実装されています。そして、コレクションのサイズが大きい場合、ラージオブジェクトヒープに割り当てられます(配列のサイズが重要であることに注意してください。大きな参照型の配列が小さい場合、LOHには割り当てられません)。

4

リストは配列として実装されます。したがって、配列はLOHに入れられますが、Listオブジェクト自体はLOHに入れられません。

基本的には同様のことが辞書にも適用されます。また、バケットの配列を内部的に使用しています。これは基本的に、追加するキーと値のペアを格納します。

0

辞書は、キー/値のためのO(NをLOG)ベクトルを有します。 Listは配列として実装されていますので、大きなリストは実際にLOHにあります。 object is on the LOH using SOSかどうかを確認できます。

関連する問題