Optimale Puffergröße für Fread / Fwrite [geschlossen]

10

Welche Puffergröße sollte ich für Lese- / Schreibdateien über POSIX-Fread / Fwrite-Funktionen wählen?


quelle
Diese Frage ist zu lokalisiert. Es bezieht sich nur auf das Programm, das Sie gerade codieren.
Weltingenieur
Ich meine allgemeinen Fall. Viele Programme Bedürfnisse zu lesen / schreiben ganze Dateien mit sehr unbekannter Größe (wie grep, cp)
Meinen Sie POSIX read/ writeFunktionen oder ANSI / ISO / IEC fread/ fwriteFunktionen?
Jan Hudec

Antworten:

6

Die ANSI / ISO- fread/fwriteFunktionen sind gepuffert. Der Puffer ist normalerweise 8 KB groß und dies gibt die Granularität unabhängig davon, was Sie in Ihrem Code verwenden. Es kann sinnvoll sein, den Puffer etwas zu erhöhen, möglicherweise auf den folgenden Wert. Für die Massenübertragung sind sie jedoch aufgrund der zusätzlichen Kopien immer etwas langsamer.

Für die POSIX- read/writeFunktionen hängt es vom Betriebssystem und dem Gerät und vielen anderen Dingen ab. Die praktische Erfahrung zeigt jedoch, dass Sie keine Leistungsverbesserung erzielen, wenn Sie den Puffer über zehn KiB hinaus erhöhen. 32 oder 64 KiB sind also ungefähr richtig.

Auf einigen Systemen ist die Abhängigkeit größer als auf anderen. Unter Linux ist der Unterschied normalerweise minimal über 8 KiB (der Standardpuffer ist also in Ordnung), z. B. unter Windows CE (mit nativer API; sie haben kein POSIX) helfen sogar noch mehr als 64 KiB. Dies kann auch vom Gerät abhängen.

Jan Hudec
quelle
so 8K für gepufferte I / O (dh fread, fwrite) und 32 / 64K für ungepufferte? Gibt es beim Senden von Bilddaten eine bestimmte Begründung für die Auswahl von gepuffert oder ungepuffert?
Francesco Boi
1
@FrancescoBoi, 8k ist nur Standard für gepufferte, die Sie ändern können. Der Punkt des Pufferns besteht darin, alle Kontextwechsel zu vermeiden, wenn Sie jeweils einige Bytes verarbeiten. Für Bilder benötigen oder haben Sie normalerweise alles und dann ist es besser, ungepuffert zu sein, da ein wenig Verarbeitung übersprungen wird.
Jan Hudec