Когда использовать класс .NET BufferedStream?
-
20-08-2019 - |
Вопрос
А Сайт MSDN состояния:
Буфер - это блок байтов в памяти, используемый для кэширования данных, тем самым уменьшая количество вызовов в операционную систему.Буферы улучшают производительность чтения и записи.Буфер можно использовать для чтения или письма, но никогда не оба одновременно.Методы чтения и записи BuffereStream автоматически поддерживают буфер.
Должен ли я использовать этот класс во всех возможных случаях?
Решение
Ниже приведен текст из онлайн-курса, который я прохожу:
Класс BufferedStream - это конкретный класс, который расширяет класс потока и используется для обеспечения дополнительного буфера памяти другому типу потока, как синхронно, так и асинхронно.Класс BufferedStream должен быть настроен для чтения или записи при создании экземпляра класса, но BufferedStream не может быть настроен для выполнения обеих задач одновременно.
Microsoft улучшила производительность всех потоков в .NET Framework, включив встроенный буфер.Производительность заметно улучшилась, применяя буферист на существующие потоки, такие как FileStream или MemoryStream.Применение буферизации к существующему потоку .NET Framework приводит к двойному буферу.
Наиболее распространенное применение класса BufferedStream заключается в классах пользовательских потоков, которые не включают встроенный буфер.
Другие советы
По словам Брэда Абрамса, практически никогда: связь
Нет, есть нулевая выгода от обертывания буферизации вокруг FileStream.Мы скопировали логику буферизации BufferedStream в FileStream около 4 лет назад, чтобы поощрять лучшую производительность по умолчанию ...На самом деле, я не думаю, что в платформе .NET есть какие -то потоки, которые требуют этого, но это может потребоваться для пользовательских реализаций потока, если они не делают буферизацию по умолчанию.
Лучший случай, который я знаю, — это сериализация/десериализация BinaryFormatter непосредственно из NetworkStream.Использование BufferedStream между ними увеличивает производительность в десять раз.
Что должно быть использование во всех возможных случаях является здравым смыслом.Нет смысла использовать этот класс при чтении и записи в MemoryStream, но он может быть весьма полезен при выполнении сетевых или дисковых операций ввода-вывода (если потоки для этих подсистем не выполняют буферизацию самостоятельно).
Обычные потоки файлового ввода-вывода уже буферизуются с помощью StreamReader/StreamWriter.
Поскольку операции чтения/записи в потоках обычно используют методы чтения/записи, которые принимают массив байтов, вы, естественно, сами обеспечите некоторую буферизацию.
Если вы используете очень маленькие массивы или используете WriteByte, вы можете повысить производительность, используя BufferedStream между ними.