【问题标题】:Why is the default char buffer size of BufferedReader 8192?为什么 BufferedReader 的默认 char 缓冲区大小是 8192?
【发布时间】:2016-09-21 02:32:35
【问题描述】:

当我构造一个新的BufferedReader 时,它为我提供了一个包含 8192 个字符的缓冲区。这背后的逻辑/原因是什么?

8192 = 2 to the power of 13

【问题讨论】:

标签: java bufferedreader


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    正如BufferedReader Javadoc 所说

    可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

    默认设置为“足够大”(我会将其解释为“足够好”)。

    【讨论】:

      【解决方案3】:

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

      BufferedReader(Reader in, int sz)
      

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-06-03
          • 1970-01-01
          • 1970-01-01
          • 2011-06-06
          • 2015-06-07
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          • 2012-05-08
          相关资源
          最近更新 更多