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.
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.
grep
,cp
)read
/write
Funktionen oder ANSI / ISO / IECfread
/fwrite
Funktionen?Antworten:
Die ANSI / ISO-
fread/fwrite
Funktionen 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/write
Funktionen 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.
quelle
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?