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

上記のコードをCLRProfilerでテストしたところ、約40MBのコードが割り当てられていると言われました。 Stringに約20MB、Char[]に9MB、StringBuilderに5MB、Int32に3MBが割り当てられています。Console.WriteLine()でのメモリ使用量の増加

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

これは約5 MBを割り当てます。 Char[]には4MBが割り当てられます。

私が得る唯一のことは、配列aには1 MB(250,000 * 4)が必要です。

なぜこのような大きな違いがありますか?最初のコードでこれらのオブジェクトがすべて必要なのはなぜですか。また、どのようにしてメモリの割り当てを減らすことができますか?

答えて

8

ほとんどの場合、メモリが増えるのは、フォーマット文字列の解析に伴う複雑さのためです。

最初のケースでは、フォーマット文字列を解析し、整数を表すローカライズされた文字列を取得し、フォーマット文字列の正しい場所に配置する必要があります。

2番目のケースでは、単一の値を出力しています。それ以上の場合は、プレーンな文字列です。これは非常に簡単です。

カバーの下にあるものに興味がある場合は.NET Reflectorを使用し、WriteLineのオーバーロードをご覧ください。

+3

おそらく定数の文字列 "0"は内部に格納されているため、インスタンスが1つしか存在しません。 –

3

ランタイム固有の質問です。
Console.WriteLineの文字列を正しく書式設定するためには、からStringへの変換のために、最初のコードで多量のメモリが使用されると思います。

関連する問題