Laden...

Buffergröße - Performance

Erstellt von T_B__ vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.338 Views
T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren
Buffergröße - Performance

Hallo zusammen,

In letzter Zeit habe ich viel mit Streams gearbeitet. Oft verwendet man einen buffer um die Daten kurz zu speichern.
In den meisten Beispielen ist die Buffergröße 1024.
Warum nimmt man immer diese Größe.?
Wie wirkt die Buffergröße auf die Performance?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo T_B__,

Wie wirkt die Buffergröße auf die Performance?

eigentlich gar nicht, weil die Daten von FileStream eh intern gepuffert werden. Siehe auch Zeilenweise aus buffer lesen?

herbivore

G
58 Beiträge seit 2007
vor 17 Jahren

größere Buffer => mehr Speicherverbrauch
kleinere Buffer => muss u.U. mehrfach lesen, weil der Buffer immer vollgelaufen war.

T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren

Original von herbivore
Zeilenweise aus buffer lesen?

Ich arbeite weniger mit Textstreams, sondern mit Binärstreams.

Original von Grollicus
größere Buffer => mehr Speicherverbrauch
kleinere Buffer => muss u.U. mehrfach lesen, weil der Buffer immer vollgelaufen war.

Ich habe die Performance mit verschiedenen Buffergrößen getestet.
größere Buffer -> mehr Speicher, aber auch schneller, da der Buffer nicht so oft vollläuft.
Warum nimmt man trotzdem so einen kleinen Wert für die Buffergröße? (1kByte)
Die heutigen Rechner haben doch genug Speicher.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo T_B__,

Ich arbeite weniger mit Textstreams, sondern mit Binärstreams.

das ändert nichts am Prinzip.

Warum nimmt man trotzdem so einen kleinen Wert für die Buffergröße? (1kByte)

Wer ist man? Normalerweise würde ich mit File.ReadAllBytes arbeiten.

herbivore

T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren

Original von herbivore
Normalerweise würde ich mit File.ReadAllBytes arbeiten.
herbivore

Das geht nur bei Dateien.

Ich meine so was:

    
...
    Stream s1 = ....
    Stream s2 = ....

    int read;
    byte[] buffer = new byte[1024];
    sw.Start();
    do
    {
        read = s1.Read(buffer, 0, buffer.Length);
        s2.Write(buffer, 0, read);
    }
    while (read > 0);
...

s1 kann z.B. ein ZipStream und s2 ein MemoryStream sein.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo T_B__,

Das geht nur bei Dateien.

das ändert nichts am Prinzip, alles komplett zu lesen.

herbivore

B
1.529 Beiträge seit 2006
vor 17 Jahren

Ich vermute eher, dass die Autoren deiner Beispiele eine gewisse Fixierung auf das Kilobyte haben.
Ich verwende meist Vielfache von 4096 Bytes, da das die Default-Clustergröße von NTFS ist. Ansonsten ist es - wie herbivore schon schrieb - meist (außer bei wirklich großen Dateien) ausreichend und einfacher die komplette Datei zu laden.

T
433 Beiträge seit 2006
vor 17 Jahren

Ähm ...

Wie gross sind den die Daten?
Weil so ne OutOfMemoryException ist schnell geschmissen.

Wenns nur ein paar kB/MB sind kannst die schon komplett einlesen.
Wenn du es aber nicht einschätzen kannst, musst du die Schrittweise lesen.

Und an der Grösse musst du selber schrauben. Normalerweise ist es egal wie gross du den Buffer wählst.
Nur bei sehr zeitnahen Sachen musst du schauen wie du mit den empfangen Daten umgehst. Ich nehm oft 32kB.
Kannst ja mal mit unterschiedlichen Buffer Grössen ausprobieren und die Zeit messen.

Bei Standard Sachen dürfte da wohl kein grosser Unterschied sein.

Gruß,
Tom