Pergunta

Pergunta boba, mas em um aplicativo winforms no qual estou trabalhando atualmente, gostaria de obter a quantidade de bytes alocados/usados ​​por um List<[SomeObject]> mantidos na memória (para fins estatísticos).Isso é possível?Eu pesquisei as opções possíveis, mas obviamente não há myList.GetTotalBytes() método.

Foi útil?

Solução

Não tenho certeza se o tempo de execução fornece um método programático confiável para obter o tamanho de um objeto, no entanto, existem algumas opções disponíveis para você:

  • use uma ferramenta como CLR Profiler
  • usar Marshal.SizeOf() (retorna o tamanho não gerenciado do objeto)
  • serialize seu objeto para binário para uma aproximação

Outras dicas

Realmente depende do que você quer dizer.Você pode prever quantos bytes serão usados ​​pela própria lista - mas isso não é o mesmo que prever quantos bytes poderão ser elegíveis para coleta de lixo se a lista se tornar elegível para coleta.

Pedaços da lista:

  • A matriz de apoio (T[] - uma referência a um array ao qual somente a lista terá acesso)
  • O tamanho (int)
  • Uma raiz de sincronização (referência)
  • O número da versão (int)

A parte complicada é decidir quanto contar.Cada um deles é bastante fácil de calcular (principalmente se você sabe que T é um tipo de referência, por exemplo), mas deseja contar os objetos referenciado pela lista?Essas referências são as únicas ou não?

Você diz que quer saber "para fins estatísticos" - poderia ser mais preciso?Se você puder dizer no que realmente está interessado (e um pouco mais de informações sobre o que está na lista e se pode haver outras referências aos mesmos objetos), provavelmente poderemos ajudar mais.

Esta pode ser uma resposta muito complicada, mas vou me arriscar e dizer que se você estiver fazendo comparações estatísticas, faça uma serialização binária do objeto para um MemoryStream e então olhe para o seu Length propriedade como tal:

    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);
    }

Observe que isso pode mudar entre diferentes versões da estrutura e só seria útil para comparações entre gráficos de objetos dentro de um único programa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top