.NET MemoryStream - я должен установить емкость? - PullRequest
24 голосов
/ 06 января 2011

Вероятно, это действительно простой вопрос, я думаю, что все, что мне нужно, - это Лучшая практика объявления нового MemoryStream

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

MemoryStream myStream = new MemoryStream(0x10000);

или

MemoryStream myStream = new MemoryStream();

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

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

Ответы [ 7 ]

26 голосов
/ 06 января 2011

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

8 голосов
/ 20 ноября 2013

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

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

2 голосов
/ 06 января 2011

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

1 голос
/ 06 января 2011

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

1 голос
/ 06 января 2011

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

0 голосов
/ 06 октября 2016

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

0 голосов
/ 06 января 2011

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

...