1

对于 java.io.InputStream,有两个主要的读取函数int read()public int read(byte[] b, int off, int len)

同样,对于 java.io.OutputStream 有两个函数write(b) 和 write((byte[] b, int off, int len))

虽然我理解基本区别,但在阅读 write(b) 的描述时,它说“要写入的字节是参数 b 的 8 个低位。b 的 24 个高位是无视。”。现在如果是这种情况,那么我们实际上是在浪费 CPU 会为整数加载的 32 位指令集中剩余的 24 位。相反,如果我使用另一个写入 ((byte[] b, int off, int len)),那么我将占用堆/堆栈来获取字节数组的大小。虽然我试图考虑哪个更适合高可扩展性,但我不能忽略 write(b) 浪费 24 位(3 个字节),而另一方面,如果我使用 read/write(byte[] b, int off, int len),我冒着更高的堆栈大小的风险。那么,最好的选择是什么?

在一种解决方法中,我尝试扩展 InputStream 和 OutputStream 并通过提供一个字节 [4] 来使用所有 32 位来覆盖 read(b) 和 write(b) 函数。它工作得很好,但仍然需要看看这是否有任何性能增强。它与使用 read/write(4, 0, int 4) 非常相似

我将不胜感激有关此主题的任何帮助/评论。

4

2 回答 2

1

如果你想达到速度,你可能想一次读.写几个字节。例如,如果您想在磁盘上写入/读取某些内容,您可能希望一次读取/写入整个扇区(4k 或 8k 字节)。

此外,这样做可以最大限度地减少系统调用的数量,因此应用程序会更快。

关于堆栈,在java中,字节数组将在堆上,并且只有@Mike提到的存储在堆栈上的引用。

于 2013-09-23T20:43:17.103 回答
1

使用带 a 的版本byte[]不会将整个字节数组推入堆栈。您将对字节数组的引用压入堆栈。

除非你只写一个字节,否则最好使用带有byte[].

于 2013-09-23T20:39:50.847 回答