Страницы

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

суббота, 20 апреля 2019 г.

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

Подскажите, в чем смысл буферизации при чтении и записи?
Почему нельзя читая сразу писать?
Например, нужно скопировать файл из пункта А в пункт Б.
Сначала мы считываем байты в буфер, а потом из этого буфера начинаем запись.
Так как буфер является настраиваемым параметрам, то когда следует использовать большой буфер, а когда маленький и какой в этом получается профит.
Например, в некоторых исходниках .NET классов явным образам пробиты константы размера буфера.


Ответ

Можно ознакомиться с этим материалом: 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 фактически хоть и буферизует данные при передаче между физическими устройствами, в данном случае скорее всего будет эффективен, за счёт уменьшения количества пакетов.

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

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