Оптимальный размер буфера для fread / fwrite [закрыто]

10

Какой размер буфера выбрать для чтения / записи файлов с помощью функций POSIX fread / fwrite?


источник
Этот вопрос слишком локализован. Это относится только к конкретной программе, которую вы кодируете в данный момент.
Мировой инженер
Я имею в виду общий случай. Многим программам необходимо читать / записывать целые файлы с очень неизвестным размером (например grep, cp)
Вы имеете в виду POSIX read/ writeфункции или ANSI / ISO / IEC fread/ fwriteфункции?
Ян Худек

Ответы:

6

Функции ANSI / ISO fread/fwriteбуферизируются. Размер буфера обычно составляет 8 КиБ, и это дает степень детализации независимо от того, что вы используете в своем коде. Возможно, имеет смысл немного увеличить буфер, возможно, до значения ниже. Для массовой передачи они всегда будут немного медленнее, хотя из-за дополнительных копий.

Для read/writeфункций POSIX это зависит от операционной системы и устройства, а также от многих других вещей, но практический опыт показывает, что вы не получите никакого улучшения производительности за счет увеличения буфера выше десятков КиБ, поэтому 32 или 64 КиБ - это то, что нужно.

В некоторых системах зависимость больше, чем в других. В Linux разница обычно минимальна выше 8 КиБ (поэтому буфер по умолчанию подходит), например, в Windows CE (с использованием собственного API; у них нет POSIX), даже больше, чем 64 КиБ, все еще помогают. Это также может зависеть от устройства.

Ян Худек
источник
так 8k для забуференном ввода / вывода (то есть fread, fwrite) и 32 / 64К для небуферизован? Если при отправке данных изображения есть какое-либо конкретное обоснование, чтобы выбрать буферизованный или небуферизованный?
Франческо Бой
1
@FrancescoBoi, 8k по умолчанию только для буферизованных, которые вы можете изменить. Точка буферизации состоит в том, чтобы избежать всех переключений контекста, когда вы обрабатываете несколько байтов за раз. Для изображения, которое вам обычно нужно или у вас есть все, а затем небуферизованное лучше, так как оно немного пропускает обработку.
Ян Худек