Tamanho ideal do buffer para fread / fwrite [fechado]

10

Qual tamanho de buffer devo escolher para arquivos de leitura / gravação através das funções fread / fwrite do POSIX?


fonte
Esta pergunta é muito localizada. Ele se refere apenas a qualquer programa específico que você esteja codificando no momento.
Engenheiro Mundial
Quero dizer caso geral. Muitos programas de necessidades para ler / gravar arquivos inteiros com tamanho muito desconhecido (como grep, cp)
Você quer dizer POSIX read/ writefunções ou ANSI / ISO / IEC fread/ fwritefunções?
Jan Hudec

Respostas:

6

As fread/fwritefunções ANSI / ISO são armazenadas em buffer. O buffer geralmente tem 8 KiB e isso fornece a granularidade independentemente do que você usa no seu código. Pode fazer sentido aumentar um pouco o buffer, talvez para o valor abaixo. Para transferência em massa, eles sempre serão um pouco mais lentos, devido às cópias extras.

Para as read/writefunções do POSIX , depende do sistema operacional e do dispositivo e muitas outras coisas, mas a experiência prática é que você não obtém nenhuma melhoria de desempenho aumentando o buffer além de dezenas de KiB; portanto, 32 ou 64 KiB estão certos.

Em alguns sistemas, a dependência é maior que em outros. No Linux, a diferença geralmente é mínima acima de 8 KiB (portanto, o buffer padrão é bom), por exemplo, no Windows CE (usando API nativa; eles não têm POSIX) ainda maiores que 64 KiB ainda ajudam. Também pode depender do dispositivo.

Jan Hudec
fonte
então 8k para E / S com buffer (ou seja fread, fwrite) e 32 / 64K para sem buffer? Se o envio de dados de imagem existe algum argumento específico para escolher buffer ou buffer?
Francesco Boi
11
@FrancescoBoi, 8k é o padrão apenas para buffer que você pode alterar. O objetivo do buffer é evitar todas as alternâncias de contexto quando você processa alguns bytes de cada vez. Para imagem, você geralmente precisa ou possui tudo e, depois, sem buffer, é melhor, pois pula um pouco do processamento.
Jan Hudec