Этот вопрос слишком локализован. Это относится только к конкретной программе, которую вы кодируете в данный момент.
Мировой инженер
Я имею в виду общий случай. Многим программам необходимо читать / записывать целые файлы с очень неизвестным размером (например 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 по умолчанию только для буферизованных, которые вы можете изменить. Точка буферизации состоит в том, чтобы избежать всех переключений контекста, когда вы обрабатываете несколько байтов за раз. Для изображения, которое вам обычно нужно или у вас есть все, а затем небуферизованное лучше, так как оно немного пропускает обработку.
grep
,cp
)read
/write
функции или ANSI / ISO / IECfread
/fwrite
функции?Ответы:
Функции ANSI / ISO
fread/fwrite
буферизируются. Размер буфера обычно составляет 8 КиБ, и это дает степень детализации независимо от того, что вы используете в своем коде. Возможно, имеет смысл немного увеличить буфер, возможно, до значения ниже. Для массовой передачи они всегда будут немного медленнее, хотя из-за дополнительных копий.Для
read/write
функций POSIX это зависит от операционной системы и устройства, а также от многих других вещей, но практический опыт показывает, что вы не получите никакого улучшения производительности за счет увеличения буфера выше десятков КиБ, поэтому 32 или 64 КиБ - это то, что нужно.В некоторых системах зависимость больше, чем в других. В Linux разница обычно минимальна выше 8 КиБ (поэтому буфер по умолчанию подходит), например, в Windows CE (с использованием собственного API; у них нет POSIX), даже больше, чем 64 КиБ, все еще помогают. Это также может зависеть от устройства.
источник
fread
,fwrite
) и 32 / 64К для небуферизован? Если при отправке данных изображения есть какое-либо конкретное обоснование, чтобы выбрать буферизованный или небуферизованный?