#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: Чтение с диска и запись производится блоками по несколько килобайт и операция эта очень медленная относительно работы с оперативной памятью. Если писать очень маленькими блоками - получаем низкую производительность, если слишком большими - большой расход оперативной памяти. Поэтому разработчики подбирают оптимальный размер буфера под конкретный случай.
Комментариев нет:
Отправить комментарий