Dimensione ottimale del buffer per fread / fwrite [chiuso]


10

Quale dimensione del buffer dovrei scegliere per i file di lettura / scrittura tramite le funzioni POSIX fread / fwrite?

c 

Questa domanda è troppo localizzata. Riguarda solo qualsiasi programma particolare che stai codificando al momento.
Ingegnere mondiale il

Intendo un caso generale. Molti programmi devono leggere / scrivere interi file con dimensioni molto sconosciute (come grep, cp)

Vuoi dire POSIX read/ writefunzioni o ANSI / ISO / IEC fread/ fwritefunzioni?
Jan Hudec,

Risposte:


6

Le fread/fwritefunzioni ANSI / ISO sono memorizzate nel buffer. Il buffer è di solito 8 KiB e ciò fornisce la granularità indipendente da ciò che si utilizza nel codice. Potrebbe avere senso aumentare un po 'il buffer, forse al valore seguente. Per il trasferimento di massa saranno sempre leggermente più lenti a causa delle copie extra.

Per le read/writefunzioni POSIX dipende dal sistema operativo e dal dispositivo e molte altre cose, ma l'esperienza pratica è che non si ottiene alcun miglioramento delle prestazioni aumentando il buffer oltre decine di KiB, quindi 32 o 64 KiB sono giusti.

In alcuni sistemi la dipendenza è maggiore rispetto ad altri. Su Linux la differenza di solito è minima al di sopra di 8 KiB (quindi il buffer predefinito va bene), ad esempio su Windows CE (usando l'API nativa; non hanno POSIX) anche più grandi di 64 KiB aiutano ancora. Potrebbe anche dipendere dal dispositivo.


quindi 8k per I / O con buffer (es fread. fwrite) e 32 / 64K per senza buffer? Se l'invio di dati di immagine esiste una logica specifica da scegliere nel buffer o nel buffer?
Francesco Boi,

1
@FrancescoBoi, 8k è predefinito solo per i buffer che è possibile modificare. Il punto del buffering è evitare tutti i cambi di contesto quando si elaborano pochi byte alla volta. Per l'immagine di solito hai bisogno o hai tutto e quindi senza buffer è meglio in quanto salta un po 'di elaborazione.
Jan Hudec,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.