Optymalny rozmiar bufora dla fread / fwrite [zamknięty]

10

Jaki rozmiar bufora powinienem wybrać dla plików do odczytu / zapisu za pomocą funkcji fread / fwrite POSIX?


źródło
To pytanie jest zbyt zlokalizowane. Odnosi się to tylko do dowolnego programu, który aktualnie kodujesz.
Inżynier świata
Mam na myśli ogólny przypadek. Wiele programów musi przeczytać / napisać całe pliki z bardzo nieznanej wielkości (jak grep, cp)
Masz na myśli POSIX read/ writefunkcje czy ANSI / ISO / IEC fread/ fwritefunkcje?
Jan Hudec

Odpowiedzi:

6

Funkcje ANSI / ISO fread/fwritesą buforowane. Bufor ma zwykle 8 KiB, co daje szczegółowość niezależnie od tego, czego używasz w kodzie. Warto nieco zwiększyć bufor, być może do wartości poniżej. W przypadku przesyłania zbiorczego zawsze będą one nieco wolniejsze ze względu na dodatkowe kopie.

W przypadku read/writefunkcji POSIX zależy to od systemu operacyjnego i urządzenia oraz wielu innych rzeczy, ale praktycznym doświadczeniem jest to, że nie uzyskuje się żadnej poprawy wydajności poprzez zwiększenie bufora ponad dziesiątki KiB, więc 32 lub 64 KiB jest w porządku.

W niektórych systemach zależność jest większa niż w innych. W Linuksie różnica jest zwykle minimalna powyżej 8 KiB (więc domyślny bufor jest w porządku), np. W Windows CE (przy użyciu natywnego API; nie mają POSIX) nawet większa niż 64 KiB nadal pomaga. Może to zależeć również od urządzenia.

Jan Hudec
źródło
tak 8k dla buforowanego I / O (np fread, fwrite) i 32 / 64K do niebuforowanego? Jeśli wysyłanie danych obrazu ma jakieś uzasadnienie, aby wybrać buforowane lub niebuforowane?
Francesco Boi
1
@FrancescoBoi, 8k jest domyślne tylko dla buforowanych, które można zmienić. Celem buforowania jest uniknięcie wszystkich przełączników kontekstu podczas przetwarzania kilku bajtów jednocześnie. W przypadku obrazu zwykle potrzebujesz go lub masz go cały, a następnie niebuforowany jest lepszy, ponieważ pomija trochę przetwarzania.
Jan Hudec