2011-06-21 22 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]); 
} 

Quando ho provato il codice precedente con CLRProfiler, mi ha detto che il codice alloca circa 40 MB. Circa 20 MB è assegnato a String, 9 MB a Char[], 5 MB a StringBuilder e 3 MB a Int32.Utilizzo 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"); 
} 

Questo alloca circa 5 MB. 4 MB sono assegnati a Char[].

L'unica cosa che ottiene è tale matrice a dovrebbe richiedere 1 MB (250.000 * 4).

Perché c'è una differenza così grande? Perché tutti gli oggetti sono necessari per il primo codice e come posso ridurre l'allocazione della memoria?

risposta

8

Molto probabilmente l'aumento di memoria è a causa della complessità insita nel parsing della stringa di formato.

Nel primo caso, si deve analizzare la stringa di formato, ottenere una stringa localizzata che rappresenta il numero intero e metterlo al posto giusto della stringa di formato.

Nel suo secondo caso si stanno output solo un singolo valore, e ancora di più, una stringa pianura. È molto banale in confronto.

Se siete interessati a ciò che accade sotto le coperte è possibile utilizzare .NET Reflector e hanno uno sguardo ai WriteLine sovraccarichi.

+3

E probabilmente la stringa costante "0" è internata, quindi esiste solo una sua istanza. –

3

È una specie di domanda specifica del runtime.
La mia ipotesi sarebbe che il primo codice utilizzi tanta memoria a causa della conversione di int in String, che deve essere eseguita per formattare correttamente la stringa per Console.WriteLine.