Puffer in der Programmierung

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

die Frage was der Unterschied zwischen Puffer und Hauptspeicher wäre wahrscheinlich zu allgemein und zu unkonkrett. Was ich eher nicht verstehe ist:

Warum gibt es überhaupt das Puffer-Konzept? Könnte man Puffer nicht einfach durch Hauptspeicher ersetzen? Puffer ist doch eigentlich nichts anderes als ein Stück Speicher? Welche Vorteile bringt mir das Puffer-Konzept in der Informatik, insbesondere in der Programmierung?

Vielen Dank für Eure Hilfestellungen. :)

Viele Grüße aus Rheinland,

Eure Ratna
 

sheel

I love Asm
Hi

bin mir nicht sicher, ob wir vom selben Buffer-"Konzept" reden.

Ein Buffer ist irgendwas, was ein temporäres "Zwischenlager" (für Daten) darstellt
(das sonst oft keinen anderen Sinn hat)

Wenn man 100 Rechenergebnisse in eine Datei schreiben will:
Wenn man die Rechnungen zuerst alle ausrechnet, die Ergebnisse in ein double-Array speichert
und dann das komplette Array auf einmal in die Datei schreibt
ist das Array ein Buffer.

Empfängt man Daten aus dem Internet (Socketzeug) hat man ein Bytearray,
das von den Socketfunktionen befüllt wird, bevor man dann das Empfangene verarbeitet.
Das Array ist auch ein Buffer.
Für die Programmfunktion würde es reichen, die empfangenen Byte zB. auszugeben,
aber das geht nicht direkt aus den Socketfunktionen raus.
Man muss die Bytes zeurst in eine Variable zwischenspeichern
und kann sie dann von dort ausgeben.

usw...
"Buffer" ist nichts Konkretes, nur ein gedankliches Etwas.
Genau genommen sind beide genannten Sachen nur ganz normale Variablen.
 

oraclin25

Erfahrenes Mitglied
Hallo Zvoni,

vielen Dank für die Links. Ich habe noch folgendes gefunden:
"Buffers can be very useful in java since they can speed up I/O operations considerably"

Warum soll mit Puffer die I/O-Operationen schneller sein? Was ist der Unterschied hierbei, wenn ich statt Puffer, einfach den normalen Arbeitspeicher nehmen würde bzw. keinen Puffer verwenden würde?

Vielen Dank für die Erklärung.

Viele Grüße aus Rheinland,

Eure Ratna
 

sheel

I love Asm
Noch einmal: Ein Buffer ist auch nur normaler Arbeitsspeicherplatz.
Es ist eine ganz normale Variable.

Zu dem englischen Satz:
Da ist etwas Anderes gemeint (die Javaleute haben das Wort Buffer
für ihr Zeug leider noch öfter verwendet)
Gemeint ist, dass ein Array (und alle Klassen, deren Sinn es ist,
innen Daten in einem Array zu speichern)
schneller ist als zB. eine LinkedList usw.
 

ComFreek

Mod | @comfreek
Moderator
Bei Speichermedien werden auch Buffer (u.a. vom Betriebssystem) benutzt.

Stell dir vor, dass du in einer Schleife 1000 Zahlen in eine Datei schreiben möchtest. Würde jetzt das Betriebssystem wirklich 1000 mal das Speichermedium dazu veranlassen, die Datei zu verändern, würde dein Programm sehr langsam laufen.

Stattdessen wird immer zuerst nur ein Buffer gefüllt. Ab einer gewissen Speichermenge wird dann alles endgültig geschrieben ("flush").

Buffer gibt es nicht nur im Arbeitsspeicher, sondern auch in der CPU beispielsweise.
 

oraclin25

Erfahrenes Mitglied
Hallo ComFreek,

vielen Dank für die Eklräung. Aber genau das verstehe ich nicht:
Stell dir vor, dass du in einer Schleife 1000 Zahlen in eine Datei schreiben möchtest. Würde jetzt das Betriebssystem wirklich 1000 mal das Speichermedium dazu veranlassen, die Datei zu verändern, würde dein Programm sehr langsam laufen.

Stattdessen wird immer zuerst nur ein Buffer gefüllt. Ab einer gewissen Speichermenge wird dann alles endgültig geschrieben ("flush").

Warum soll mit Buffer dieser Vorgang schneller sein? Denn, die Aktionen sind doch sowohl mit Buffer oder nicht, immer noch die Gleichen? Nämlich, 1000 mal je eine Zahl lesen, dann 1000 mal je eine Zahl schreiben. Wo habe ich hier den Denkfehler?

Viele Grüße aus Rheinland,

Eure Ratna:)
 

MCoder

Erfahrenes Mitglied
Hallo,

bezogen auf das Beispiel von ComFreek: Schreiboperationen in das Dateisystem sind wesentlich langsamer als solche in den Hauptspeicher. Dabei ist das Problem weniger die Datenmenge sondern mehr der Vorgang an sich. Deshalb ist es performanter statt vieler kleiner Happen nur
wenige große in die Datei zu speichern und dazwischen die Daten im Hauptspeicher zu sammeln.

Gruß
MCoder
 

Zvoni

Erfahrenes Mitglied
Um mal im Beispiel aus dem Stackoverflow-Link zu bleiben:

Stell dir vor, du hast ne BonBon-Maschine, aus der alle 2 Sekunden ein fertiges BonBon fällt.

Was ist jetzt schneller?

Alle 2 Sekunden das fertige Bonbon nehmen, dauernd die Stückzahl aktuell halten und in den Karton machen bis 100 Stück erreicht sind,
oder unter die Maschine einen Korb (=Buffer) stellen, der auf einer Zähl-Waage steht, und bei erreichen der 100 Stück in den Karton auf einen Schlag entleert wird?
 

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

vielen lieben Dank für Eure Erklärungen. Das Beispiel mit der Bon-Bon-Maschine hat mir geholfen. Nun versuche ich dieses Beispiel in einen konkreten Java-Fall zu übertragen:

Code:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));

Liege ich richtig, wenn ich sage:
Ohne BufferedReader würde das Objekt inputStream Zeichen pro Zeichen lesen, was sehr lange dauern würde.

Mit BufferedReader liest das Objekt inputStream alle Zeichen bis nichts mehr zu lesen ist(inputStream tut erstmal alle Zeichen in einen Topf bzw. in ein Buffer).

Ist das richtig?

Viele Grüße aus Rheinland,

Eure Ratna:)