0

有一个常见的模式,当应用程序的每一层处理来自流的数据时,往往会将其包装到一个 BufferedInputStream 中,因此总的来说,有很多缓冲区,从缓冲区填充,从缓冲区填充等等。

我认为这是不好的做法,并想质疑:它如何影响性能?这会导致错误吗?

4

3 回答 3

3

这是一个非常普遍的问题,但我想说有很多层缓冲输入流(任何语言)存在许多问题。

  • 每个缓冲区都会占用内存,即使它没有被填满。因此,即使数据直接被吸到顶层“层”,内存仍然被不必要地使用。(注意:我假设 Java 不会自动调整其缓冲区大小或其他任何东西——而且我不是 Java 专家。)
  • 每当您从顶级缓冲区中读取数据时,都会引发一连串的方法调用。方法调用涉及间接(即指针跟踪)、数据传递(可能导致缓存性能不佳)等。
  • 这可能意味着设计没有经过深思熟虑,因为缓冲流通常应该用于从实际需要缓冲的源(如磁盘或网络)中读取。

只是对这个问题的一些想法。我确信有更好的 Java 知识的人可以提供更详细的分析。

于 2010-08-06T11:01:34.427 回答
1

由于额外的缓冲区,它会增加内存占用,但我怀疑它很少见,因为它可能涉及的大小实际上会对给定程序产生重大影响。在您需要之前不要尝试优化的标准规则。

也必然会有轻微的处理器开销,但这将更不重要。

这完全取决于它的使用量,如果有很多大链可能会出现问题,但我认为这不太可能成为问题。

正如大卫所说,这可能表明设计不佳。组件能够直接共享更复杂的对象可能会更有效,但这一切都取决于特定用途(而且我很难想到你会以这种方式使用多个缓冲流)。

于 2010-08-06T11:02:09.913 回答
1

这确实是非常糟糕的做法,并且确实会导致错误。如果方法 A 进行了一些读取,然后将流传递给附加了 BufferedInputStream 并进行更多读取的方法 B,则 BufferedInputStream 将填充其缓冲区,这可能会消耗方法 A 期望在方法 B 返回时仍然存在的数据。方法 B 的 BufferedInputStream 提前读取可能会丢失数据。

至于开销,在实践中,如果读/写足够大,中间缓冲区无论如何都会被绕过,所以几乎没有你想象的那么多额外的复制:性能影响主要是额外的内存空间加上额外的方法调用。

于 2010-08-06T13:28:26.957 回答