2016-05-24 2 views
1

Wenn ich ein neues BufferedReader konstruiere, stellt es mir einen Puffer von 8192 Zeichen zur Verfügung. Was ist die Logik/der Grund dafür?Warum ist die Standard-Zeichenpuffergröße von BufferedReader 8192?

8192 = 2 to the power of 13 
+1

Die Quelle von BufferedReader sagt "Der Standard ist groß genug für die meisten Zwecke." http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/io/BufferedReader.java – Arjan

Antwort

2

Herkömmlicherweise arbeiten Speichermanager und Auslagerungsdateien im Betriebssystem auf Seiten, die eine Poten- zialgröße von 2 haben. Dies ermöglicht sehr effiziente Multiplikations-/Divisionsoperationen mit Links/Rechts-Shift-Vorgängen. Beim Arbeiten mit einem Puffer ist im schlimmsten Fall ein Puffer mit einer Größe von 1 Byte länger als die Seitengröße (dies würde zu einem zusätzlichen Seitentausch mit sehr geringem Nutzen führen). Daher werden die Standardpuffergrößen tendenziell auch in Zweierfaktoren implementiert.

Ich würde annehmen (aber nicht überprüft), dass die JVM nach solchen Puffern sucht und versucht, sie auf Seitengrenzen auszurichten.

Warum ist das wichtig? Seitenfehler sind ziemlich teuer. Wenn Sie eine Tonne IO machen, ist es besser, den Fall zu vermeiden, in dem die Seite, die den Puffer unterstützt, auf die Platte ausgelagert wird (was den Zweck des Puffers zunichte macht). Für die meisten Anwendungen ist dies jedoch eine Mikrooptimierung, und für die überwiegende Mehrheit der Fälle ist die Standardeinstellung in Ordnung.

Als Referenz verwenden Windows und Linux beide derzeit eine 4KB Speicherseitengröße. Der Standardpuffer auf BufferedReader verbraucht also genau 2 Seiten.

1

Als BufferedReader Javadoc sagt

Die Puffergröße festgelegt werden kann, oder die Standardgröße verwendet werden kann. Der Standardwert ist für die meisten Zwecke groß genug.

Der Standard wurde als „groß genug“ gewählt (was ich als „gut genug“ interpretieren würde).

0

8192, wie Sie sagten, ist 2^13. Der genaue Grund dafür, dass diese Zahl der Standardwert ist, ist schwer zu erreichen, aber ich würde sagen, dass sie auf der Kombination von normalen Nutzungsszenarien und Dateneffizienz basiert. Sie können jedoch mit einem anderen Objektkonstruktor eine beliebige Puffergröße angeben.

Erstellt einen Pufferzeicheneingabestream, der einen Eingabepuffer der angegebenen Größe verwendet.

https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html und BufferedReader default buffer size? bieten weitere Einblicke.

Verwandte Themen