リストのバイトサイズを取得< T>
質問
愚かな質問ですが、現在作業中のwinformsアプリでは、メモリに保持されている List< [SomeObject]>
によって割り当て/使用されているバイト数を取得したい(統計用)目的)。これは可能ですか?可能なオプションを検索しましたが、明らかに myList.GetTotalBytes()
メソッドはありません。
解決
ランタイムがオブジェクトのサイズを取得する信頼できるプログラムによる方法を提供するかどうかはわかりませんが、いくつかのオプションが利用可能です:
- CLR Profilerなどのツールを使用する
- Marshal.SizeOf()を使用します(オブジェクトの管理されていないサイズを返します)
- 近似のためにオブジェクトをバイナリにシリアル化します
他のヒント
それは本当にあなたが何を意味するかに依存します。リスト自体が使用するバイト数を予測できますが、リストがコレクションに適格になった場合にガベージコレクションに適格なバイト数を予測することとは異なります。
リストのビット:
- バッキング配列(
T []
-リストのみがアクセスできる配列への参照) - サイズ(int)
- 同期ルート(参照)
- バージョン番号(int)
トリッキーなビットは、カウントする量を決定します。これらのそれぞれは計算が非常に簡単です(特にTが参照型であることがわかっている場合など)が、リストで参照されるオブジェクトをカウントしますか?これらの参照は唯一のものですか?
「統計目的で」知りたいと言います。 -もっと正確にできますか?本当に興味のあること(およびリストにあるものについてのもう少しの情報、および同じオブジェクトへの他の参照があるかもしれないかどうか)を言うことができれば、おそらくもっと役立つでしょう。
これは馬鹿げた答えかもしれませんが、私は手足に出て、統計的な比較を行う場合は、オブジェクトの MemoryStreamへのバイナリシリアル化を行います
そして、その Length
プロパティを見てください:
List<string> list = new List<string>
{
"This",
"is",
"a",
"test"
};
using (Stream stream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, list);
Console.WriteLine(stream.Length);
}
これはフレームワークの異なるバージョン間で変更される可能性があり、単一のプログラム内のオブジェクトグラフ間の比較にのみ役立つことに注意してください。