【问题标题】:Optimal block size in java streamsjava流中的最佳块大小
【发布时间】:2011-08-03 13:26:39
【问题描述】:

我有一个理论问题。假设您有一个InputStream 和一个OutputStream。您需要将内容从一个复制到另一个,并且您不知道需要传输的内容的确切大小。 write 方法中块大小的最佳选择是什么?

【问题讨论】:

  • 这被称为“过早优化”。使用诸如 Apache Commons IO 之类的库,然后,如果您遇到性能问题,请调整块大小。最佳值将取决于连接到输入和输出流的内容(磁盘文件、管道、网络连接等)
  • 我通常使用 4096 作为文件访问的块大小。它在很多情况下都很有效。虽然 4096 是非常小的块,但与磁盘访问成本相比,方法调用成本可以忽略不计。

标签: java sockets stream io


【解决方案1】:

答案是:视情况而定。对于一般解决方案,别担心,只需使用库即可。常见选择:

【讨论】:

    【解决方案2】:

    BufferedInputStream 和 BufferedOutputStream 的默认缓冲区大小为 8 KB,这通常是一个不错的大小。

    注意:如果您读取 Socket 的速度足够快,您很少会收到更多的数据包,大约 1.5 KB。如果您从磁盘读取,您通常会获得所需的任何大小,但是性能从 32 KB 到 256 KB 并没有太大提高,并且可能取决于您使用的硬件。

    但是我也发现,除非您进行基准测试,否则如果您仅使用 512 字节作为缓冲区大小(Inflator/Deflator 流会这样做),那么您很少会看到明显的差异,即差异可能是 15% 或更少。

    总之,您不太可能注意到缓冲区大小在 512 字节和 32 KB 之间的差异。对于大多数情况,后者可能绰绰有余。我倾向于使用 256 KB,因为我有很多内存和很少的预分配缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 2014-09-02
      • 2016-05-14
      • 1970-01-01
      • 2019-10-09
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多