有一个常见的模式,当应用程序的每一层处理来自流的数据时,往往会将其包装到一个 BufferedInputStream 中,因此总的来说,有很多缓冲区,从缓冲区填充,从缓冲区填充等等。
我认为这是不好的做法,并想质疑:它如何影响性能?这会导致错误吗?
有一个常见的模式,当应用程序的每一层处理来自流的数据时,往往会将其包装到一个 BufferedInputStream 中,因此总的来说,有很多缓冲区,从缓冲区填充,从缓冲区填充等等。
我认为这是不好的做法,并想质疑:它如何影响性能?这会导致错误吗?
这是一个非常普遍的问题,但我想说有很多层缓冲输入流(任何语言)存在许多问题。
只是对这个问题的一些想法。我确信有更好的 Java 知识的人可以提供更详细的分析。
由于额外的缓冲区,它会增加内存占用,但我怀疑它很少见,因为它可能涉及的大小实际上会对给定程序产生重大影响。在您需要之前不要尝试优化的标准规则。
也必然会有轻微的处理器开销,但这将更不重要。
这完全取决于它的使用量,如果有很多大链可能会出现问题,但我认为这不太可能成为问题。
正如大卫所说,这可能表明设计不佳。组件能够直接共享更复杂的对象可能会更有效,但这一切都取决于特定用途(而且我很难想到你会以这种方式使用多个缓冲流)。
这确实是非常糟糕的做法,并且确实会导致错误。如果方法 A 进行了一些读取,然后将流传递给附加了 BufferedInputStream 并进行更多读取的方法 B,则 BufferedInputStream 将填充其缓冲区,这可能会消耗方法 A 期望在方法 B 返回时仍然存在的数据。方法 B 的 BufferedInputStream 提前读取可能会丢失数据。
至于开销,在实践中,如果读/写足够大,中间缓冲区无论如何都会被绕过,所以几乎没有你想象的那么多额外的复制:性能影响主要是额外的内存空间加上额外的方法调用。