为什么 BufferedReader 的默认 char 缓冲区大小是 8192?

Why is the default char buffer size of BufferedReader 8192?

当我构建一个新的 BufferedReader 时,它为我提供了一个 8192 个字符的缓冲区。这背后的logic/reason是什么?

8192 = 2 to the power of 13

BufferedReader Javadoc所说

The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.

默认值被选择为 "large enough"(我会 解释为 "good enough")。

8192,如你所说,是2^13。这个数字成为默认值的确切原因很难得出,但我敢说这是基于正常使用场景和数据效率的结合。不过,您可以使用不同的对象构造函数指定任意大小的缓冲区。

BufferedReader(Reader in, int sz)

创建使用指定大小的输入缓冲区的缓冲字符输入流。

https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html BufferedReader default buffer size? 将提供进一步的见解。

传统上,操作系统中的内存管理器和分页文件在大小为 2 的幂的页面上工作。这允许使用 left/right 移位操作执行非常高效的 multiply/divide 操作。使用缓冲区时,最坏的情况是缓冲区的大小比页面大小长 1 个字节(这将导致额外的页面交换,但收益非常低)。因此默认缓冲区大小也将倾向于以两倍的形式实现。

我假设(但尚未检查)JVM 寻找这样的缓冲区并尝试将它们对齐到页面边界。

为什么这很重要?页面未命中的代价非常高。如果您正在进行大量 IO,最好避免支持缓冲区的页面换出到磁盘的情况(有点违背缓冲区的目的)。也就是说,对于大多数应用程序来说,这是一个微优化,对于绝大多数情况,默认值就可以了。

作为参考,Windows 和 Linux 目前都使用 4KB 内存页大小。所以 BufferedReader 上的默认缓冲区将恰好占用 2 页。

8192 是 2^13 并且还揭示了很多关于我们所做的所有编码的正确与错误的信息。如果一个人拿走了或增加了作者的意图,他就修改并因此破坏了整个事情。尝试添加或删除一些完美的东西......祝你好运!