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

Kiedy przetestowałem powyższy kod przy pomocy CLRProfiler, powiedział mi, że kod przydziela około 40 MB. Około 20 MB jest przydzielone na String, 9 MB na Char[], 5 MB na StringBuilder i 3 MB na Int32.Zwiększone wykorzystanie pamięci dzięki Console.WriteLine()

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

Ten przydziela około 5 MB. 4 MB jest przydzielone na Char[].

Jedyne co otrzymuję to to, że tablica a powinna wymagać 1 MB (250 000 * 4).

Dlaczego istnieje tak ogromna różnica? Dlaczego wszystkie te obiekty są wymagane dla pierwszego kodu i jak zmniejszyć alokację pamięci?

Odpowiedz

8

Najprawdopodobniej wzrost pamięci wynika z złożoności procesu parsowania ciągu formatów.

W pierwszym przypadku należy przeanalizować ciąg formatu, uzyskać zlokalizowany łańcuch reprezentujący liczbę całkowitą i umieścić go we właściwym miejscu ciągu formatu.

W drugim przypadku wypisujesz tylko jedną wartość, a jeszcze bardziej zwykły ciąg znaków. W porównaniu jest to bardzo trywialne.

Jeśli interesuje Cię to, co się dzieje pod kołdrą, możesz użyć .NET Reflector i spojrzeć na przeciążenia WriteLine.

+3

I prawdopodobnie stały ciąg "0" jest internowany, więc istnieje tylko jedna jego instancja. –

3

Jest to rodzaj pytania specyficznego dla środowiska wykonawczego.
Domyślam się, że pierwszy kod zużywa tyle pamięci z powodu konwersji int na String, która musi zostać wykonana w celu prawidłowego sformatowania ciągu znaków dla Console.WriteLine.

Powiązane problemy