Высокое использование памяти с Console.WriteLine () - PullRequest
8 голосов
/ 21 июня 2011
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, он сказал мне, что код выделяет примерно 40 МБ.Около 20 МБ выделяется для String, от 9 МБ до Char[], от 5 МБ до StringBuilder и от 3 МБ до Int32.

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

Это выделяет около 5 МБ.4 МБ выделено на Char[].

Единственное, что я получаю, это то, что массив a должен требовать 1 МБ (250 000 * 4).

Почему такая огромная разница?Почему все эти объекты требуются для первого кода и как мне уменьшить выделение памяти?

Ответы [ 2 ]

9 голосов
/ 21 июня 2011

Скорее всего, увеличение памяти происходит из-за сложности синтаксического анализа строки формата.

В первом случае необходимо проанализировать строку формата, получить локализованную строку, представляющую целое число, и поместить ее в нужное место строки формата.

Во втором случае вы выводите только одно значение и, более того, простую строку. Это очень тривиально по сравнению.

Если вас интересует, что происходит под одеялом, вы можете использовать .NET Reflector и посмотреть на перегрузки WriteLine.

3 голосов
/ 21 июня 2011

Это вопрос конкретного времени выполнения.
Я предполагаю, что первый код использует так много памяти из-за преобразования int в String, что необходимо сделать для правильного форматирования строки для Console.WriteLine.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...