.NET MemoryStream. Должен ли я установить емкость?
Это, наверное, очень простой вопрос, я думаю, что все, что мне нужно, - это Best Practice для объявления нового MemoryStream
В чем разница между следующими двумя образцами:
MemoryStream myStream = new MemoryStream(0x10000);
или
MemoryStream myStream = new MemoryStream();
Очевидно, я знаю, что первый пример устанавливает начальную емкость потока. Но, оба они имеют автоматически изменяемую емкость.
У меня есть какая-то причина, по которой я должен использовать один метод в отличие от другого?
Ответы
Ответ 1
Есть служебные данные, связанные с повторной калибровкой потока памяти. Если вы знаете или иным образом имеете разумное предположение относительно ожидаемого размера, необходимого для хранения в потоке памяти, вы захотите использовать этот размер в качестве начальной емкости. В противном случае используется размер по умолчанию 0 и будет изменен по мере добавления данных.
Ответ 2
Старый вопрос, который я знаю, но только для записи;
Если вы имеете дело с действительно большим объемом данных (более одного ГБ в моем случае), установка первоначальной емкости была единственным способом заставить ее работать в течение приемлемого периода времени и без убийства сервера. В этом случае решающее значение имеет перераспределение служебных данных.
Ответ 3
Если вы уже знаете, сколько именно байтов вы хотите сохранить в явном виде в конструкторе, кажется правильным: в общем, я бы поставил его как можно проще и просто использовал конструктор по умолчанию без параметров, это еще один вещь, которую вы должны читать и понимать при сохранении кода в противном случае.
Ответ 4
Если вам известен размер, который вам понадобится, я считаю, что установка размера явно повышает производительность, потому что фрейму не придется изменять размер потока несколько раз.
Ответ 5
Если вы знаете, что у вас будет 0x10000 байт данных, первый фрагмент кода гарантирует, что поток памяти будет инициализирован до такого размера и никогда не будет нуждаться в увеличении. В зависимости от того, как класс управляет буфером внизу и может ли он иметь непрерывный блок памяти, могут быть некоторые последствия для производительности; в зависимости от специфики, изменение размера может быть дорогостоящей операцией.
Ответ 6
В первом случае вы избегаете автоматического изменения размера структуры, в то время как необходимый размер меньше значения, переданного конструктору.
Ответ 7
При изменении размера потока памяти он создает новый байт [] буфера нового размера. Если эта операция выполняется часто, вы можете столкнуться с одной из двух проблем в зависимости от размера буфера:
1. Система выбрасывает исключение OurOfMemoryException
2. Вся память в куче фрагментируется. Это дает непредсказуемые последствия. Например, конструктор System.Drawing.Bitmap не работает с сообщением "Параметр недействителен".