Использование FILE_FLAG_NO_BUFFERING вернет заметное увеличение скорости? - PullRequest
6 голосов
/ 01 января 2011

Недавно заметил подробное описание флага FILE_FLAG_NO_BUFFERING в MSDN и прочитал несколько результатов поиска Google о небуферизованном вводе-выводе в Windows.

http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx

Интересно, действительно ли это важно?рассмотреть небуферизованный вариант в программировании файлового ввода-вывода?Поскольку многие программы используют простой старый поток ввода-вывода C или iostream C ++, я раньше не обращал внимания на флаг FILE_FLAG_NO_BUFFERING.

Допустим, мы разрабатываем программу для просмотра фотографий, такую ​​как Picasa.Если мы реализуем небуферизованный ввод / вывод, может ли скорость отображения миниатюр показать заметную разницу у обычных пользователей?

Ответы [ 3 ]

13 голосов
/ 01 января 2011

О, Господи, нет. Вы делаете это значительно медленнее, используя этот флаг. Он обходит кеш файловой системы, тот замечательный кусок кода, который может с почти безумной точностью угадать, что вы захотите прочитать сектор N + 1 после чтения N. И просто предварительно загрузите его, если его дешево получить.

Это особенно плохо для записи, поэтому опция существует, вы не получаете отложенной обратной записи. Это означает, что ваша программа может работать только так быстро, как диск может записать. Что очень, очень медленно. Преимущество флага в том, что вы можете быть уверены, что он написан. Помогает реализовать транзакционные обновления дисков, о которых заботятся движки dbase.

Но попробуйте это сами, чтобы увидеть эффект.

7 голосов
/ 01 января 2011

Нет, этот флаг не для типичных пользователей диска. Это для таких программ, как базы данных, где им необходимо выполнять собственное управление файловым кешем для оптимальной производительности. Хотя я уверен, что вы могли бы найти ситуации, в которых это ускорило бы вашу программу, по большей части вы захотите использовать буферизацию, предоставляемую ОС - вот почему она там есть.

1 голос
/ 03 марта 2019

Я недавно экспериментировал с этим.Поскольку я уже делал свое собственное управление буфером (реализуя пару буферов, которая обычно используется в синтаксических анализаторах), я подумал, что FILE_FLAG_NO_BUFFERING может помочь, избегая лишних копий.Я пробовал разные (выровненные по размеру страницы) размеры буфера, но это всегда было медленнее, чем использование флага.

Поскольку моя схема включала чтение всего файла один раз, по порядку, я попытался вместо этого FILE_FLAG_SEQUENTIAL_SCAN, и это на самом делепомогло немного.

Когда вы отключаете буферизацию, вы не получаете преимущества предварительной выборки и других приемов кэширования, которые использует ОС.Когда вы даете правильную «подсказку», такую ​​как FILE_FLAG_SEQUENTIAL_SCAN, тогда вы максимально используете эти функции ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...