2011-06-21 12 views
7
public static void Main() 
{ 
    int size = 250000; 
    var a = new int[size]; 
    for (int i = 0; i < size; i++) 
     Console.WriteLine("{0}", a[i]); 
} 

Cuando probé el código anterior con CLRProfiler, me dijo que el código asigna aproximadamente 40 MB. Se asignan alrededor de 20 MB a String, 9 MB a Char[], 5 MB a StringBuilder y 3 MB a Int32.Uso de memoria alta con Console.WriteLine()

public static void Main() 
{ 
    int size = 250000; 
    var a = new int[size]; 
    for (int i = 0; i < size; i++) 
     Console.WriteLine("0"); 
} 

Éste asigna alrededor de 5 MB. Se asignan 4 MB a Char[].

Lo único que obtengo es que la matriz a debería requerir 1 MB (250,000 * 4).

¿Por qué hay una gran diferencia? ¿Por qué se requieren todos esos objetos para el primer código y cómo reduzco la asignación de memoria?

Respuesta

8

Lo más probable es que el aumento de la memoria se deba a la complejidad involucrada en el análisis de la cadena de formato.

En su primer caso, tiene que analizar la cadena de formato, obtener una cadena localizada que represente el número entero y colocarla en el lugar correcto de la cadena de formato.

En su segundo caso está produciendo un solo valor, y aún más, una cadena simple. Es muy trivial en comparación.

Si está interesado en lo que sucede bajo las sábanas, puede usar .NET Reflector y echar un vistazo a las sobrecargas WriteLine.

+3

Y, probablemente, la cadena constante "0" está interna, por lo que solo existe una instancia de la misma. –

3

Es una especie de pregunta específica de tiempo de ejecución.
Supongo que el primer código usa tanta memoria debido a la conversión de int a String, que tiene que realizarse para formatear la cadena para Console.WriteLine correctamente.

Cuestiones relacionadas