Pregunta

Pregunta tonta, pero en una aplicación winforms en la que estoy trabajando actualmente, me gustaría obtener la cantidad de bytes asignados / utilizados por una List < [SomeObject] > almacenada en la memoria (para estadísticas propósitos). es posible? He buscado a través de las opciones posibles, pero obviamente no hay ningún método myList.GetTotalBytes () .

¿Fue útil?

Solución

No estoy seguro de que el tiempo de ejecución proporcione un método programático confiable para obtener el tamaño de un objeto, sin embargo, hay algunas opciones disponibles para usted:

  • use una herramienta como CLR Profiler
  • use Marshal.SizeOf () (devuelve el tamaño no administrado del objeto)
  • serializa tu objeto a binario para una aproximación

Otros consejos

Realmente depende de lo que quieras decir. Puede predecir cuántos bytes utilizará la lista en sí, pero eso no es lo mismo que predecir cuántos bytes podrían ser elegibles para la recolección de basura si la lista se volviera elegible para la recolección.

Bits de la lista:

  • La matriz de respaldo ( T [] - una referencia a una matriz a la que solo la lista tendrá acceso)
  • El tamaño (int)
  • Una raíz de sincronización (referencia)
  • El número de versión (int)

La parte difícil es decidir cuánto contar. Cada uno de ellos es bastante fácil de calcular (especialmente si sabe que T es un tipo de referencia, por ejemplo), pero ¿desea contar los objetos referenciados por la lista? ¿Son esas referencias las únicas o no?

Dices que quieres saber " para fines estadísticos " - ¿podrías ser más preciso? Si puede decir lo que realmente le interesa (y un poco más de información sobre lo que está en la lista y si puede haber otras referencias a los mismos objetos), probablemente podríamos ayudarlo más.

Esta puede ser una respuesta completa, pero voy a ponerme nervioso y decir que si está haciendo comparaciones estadísticas, realice una serialización binaria del objeto en un MemoryStream y luego mire su propiedad Length 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);
    }

Tenga en cuenta que esto podría cambiar entre diferentes versiones del marco y solo sería útil para las comparaciones entre gráficos de objetos dentro de un solo programa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top