Подтвердить что ты не робот

.NET MemoryStream. Должен ли я установить емкость?

Это, наверное, очень простой вопрос, я думаю, что все, что мне нужно, - это Best Practice для объявления нового MemoryStream

В чем разница между следующими двумя образцами:

MemoryStream myStream = new MemoryStream(0x10000);

или

MemoryStream myStream = new MemoryStream();

Очевидно, я знаю, что первый пример устанавливает начальную емкость потока. Но, оба они имеют автоматически изменяемую емкость.

У меня есть какая-то причина, по которой я должен использовать один метод в отличие от другого?

4b9b3361

Ответ 1

Есть служебные данные, связанные с повторной калибровкой потока памяти. Если вы знаете или иным образом имеете разумное предположение относительно ожидаемого размера, необходимого для хранения в потоке памяти, вы захотите использовать этот размер в качестве начальной емкости. В противном случае используется размер по умолчанию 0 и будет изменен по мере добавления данных.

Ответ 2

Старый вопрос, который я знаю, но только для записи;

Если вы имеете дело с действительно большим объемом данных (более одного ГБ в моем случае), установка первоначальной емкости была единственным способом заставить ее работать в течение приемлемого периода времени и без убийства сервера. В этом случае решающее значение имеет перераспределение служебных данных.

Ответ 3

Если вы уже знаете, сколько именно байтов вы хотите сохранить в явном виде в конструкторе, кажется правильным: в общем, я бы поставил его как можно проще и просто использовал конструктор по умолчанию без параметров, это еще один вещь, которую вы должны читать и понимать при сохранении кода в противном случае.

Ответ 4

Если вам известен размер, который вам понадобится, я считаю, что установка размера явно повышает производительность, потому что фрейму не придется изменять размер потока несколько раз.

Ответ 5

Если вы знаете, что у вас будет 0x10000 байт данных, первый фрагмент кода гарантирует, что поток памяти будет инициализирован до такого размера и никогда не будет нуждаться в увеличении. В зависимости от того, как класс управляет буфером внизу и может ли он иметь непрерывный блок памяти, могут быть некоторые последствия для производительности; в зависимости от специфики, изменение размера может быть дорогостоящей операцией.

Ответ 6

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

Ответ 7

При изменении размера потока памяти он создает новый байт [] буфера нового размера. Если эта операция выполняется часто, вы можете столкнуться с одной из двух проблем в зависимости от размера буфера: 1. Система выбрасывает исключение OurOfMemoryException 2. Вся память в куче фрагментируется. Это дает непредсказуемые последствия. Например, конструктор System.Drawing.Bitmap не работает с сообщением "Параметр недействителен".