Страницы

Поиск по вопросам

среда, 12 февраля 2020 г.

Буферизация при IO в C#

#c_sharp #net


Подскажите, в чем смысл буферизации при чтении и записи?

Почему нельзя читая сразу писать?

Например, нужно скопировать файл из пункта А в пункт Б.

Сначала мы считываем байты в буфер, а потом из этого буфера начинаем запись.

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

Например, в некоторых исходниках .NET классов явным образам пробиты константы размера
буфера.
    


Ответы

Ответ 1



Можно ознакомиться с этим материалом: Sequential File Programming Patterns and Performance with .NET. Написана статья в 2004, но обновление сделано в 2010 (судя по датам в тексте). Приведу выдержку (вольный перевод мой): Для одного диска используйте настройки по умолчанию фреймворка .NET - они предоставляют отличную производительность для последовательного доступа к файлу. Предварительно выделяйте место для больших файлов (используя SetLength() method), когда создаете файл. Это обычно улучшает скорость примерно на 13% в сравнении с фрагментированным файлом. По крайней мере, сейчас, дисковые массивы требуют небуферизованный IO для достижения лучшей производительности. Буферизованный IO может быть в 8 раз медленнее, чем небуферизованный. Мы ожидаем, что эта проблема будет рассмотрена в более поздних выпусках .NET-фреймворка. Если вы делаете свою собственную буферизацию, используйте большие размеры буфера (64 Кб хорошая отправная точка). Используя .NET-фреймворк, один процессор может читать и писать дисковый массив на скорости свыше 800 Мб*сек, используя небуферизованный IO. Самым интересным в этом списке является пункт 3: при копировании данных с одного физического диска на другой физический буферизация вредна (естественно, буферизация на уровне драйвера диска остается). В остальных случаях она, по крайней мере, не вредит. Подумав, решил добавить, что BufferedStream, применяемый поверх NetworkStream фактически хоть и буферизует данные при передаче между физическими устройствами, в данном случае скорее всего будет эффективен, за счёт уменьшения количества пакетов.

Ответ 2



в дополнение к ответу vitidev: Чтение с диска и запись производится блоками по несколько килобайт и операция эта очень медленная относительно работы с оперативной памятью. Если писать очень маленькими блоками - получаем низкую производительность, если слишком большими - большой расход оперативной памяти. Поэтому разработчики подбирают оптимальный размер буфера под конкретный случай.

Комментариев нет:

Отправить комментарий