當我構建一個新的BufferedReader
它提供了一個8192個字符的緩衝區。這背後的邏輯/原因是什麼?爲什麼BufferedReader 8192的默認字符緩衝區大小?
8192 = 2 to the power of 13
當我構建一個新的BufferedReader
它提供了一個8192個字符的緩衝區。這背後的邏輯/原因是什麼?爲什麼BufferedReader 8192的默認字符緩衝區大小?
8192 = 2 to the power of 13
傳統上,操作系統中的內存管理器和分頁文件在大小爲2的冪的頁面上工作。這允許使用左/右移操作來執行非常有效的乘/除操作。使用緩衝區時,最糟糕的情況是使緩衝區的大小比頁面大小長1個字節(這會導致額外的頁面交換,但效益很低)。因此,默認緩衝區大小也傾向於以兩個因子實現。
我假設(但沒有檢查)JVM尋找像這樣的緩衝區並嘗試在頁面邊界上對齊它們。
這是爲什麼?頁面丟失相當昂貴。如果你正在做大量的IO,最好避免支持緩衝區的頁面被換出到磁盤的情況(這種情況會破壞緩衝區的目的)。這就是說,對於大多數應用程序來說,這是一個微型優化,對絕大多數情況來說,默認情況很好。
僅供參考,Windows和Linux均使用4KB內存頁面大小。因此,BufferedReader上的默認緩衝區將佔用2頁。
8192,正如你所說的,是2^13。這個數字是默認的確切原因很難得出,但我敢說這是基於正常使用場景和數據效率的結合。儘管如此,您可以使用不同的對象構造函數來指定所需的緩衝區大小。
BufferedReader(Reader in, int sz)
創建使用指定大小的輸入緩衝區的緩衝字符輸入流。
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html 和BufferedReader default buffer size?將提供進一步的見解。
BufferedReader的來源說:「默認對於大多數目的而言足夠大。」 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/io/BufferedReader.java – Arjan