문제
어리석은 질문이지만 현재 작업중 인 Winforms 앱에서 List<[SomeObject]>
메모리로 유지됩니다 (통계적 목적). 이게 가능해? 가능한 옵션을 통해 검색했지만 분명히 myList.GetTotalBytes()
방법.
해결책
런타임이 객체의 크기를 얻는 신뢰할 수있는 프로그래밍 방식을 제공하는지 확실하지 않지만 몇 가지 옵션이 있습니다.
- CLR 프로파일 러와 같은 도구를 사용하십시오
- 사용 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);
}
이는 다른 버전의 프레임 워크간에 변경 될 수 있으며 단일 프로그램 내의 객체 그래프를 비교하는 데만 유용합니다.
제휴하지 않습니다 StackOverflow