문제

어리석은 질문이지만 현재 작업중 인 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);
    }

이는 다른 버전의 프레임 워크간에 변경 될 수 있으며 단일 프로그램 내의 객체 그래프를 비교하는 데만 유용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top