1

是否可以基于字节索引 Java 数组?

即类似的东西

array[byte b] = x;

我有一个性能非常关键的应用程序,它从文件中读取 b(在上面的代码中),我不希望将其转换为 int 的开销。实现这一目标的最佳方法是什么?使用这种索引方法而不是 int 是否会导致性能下降?

非常感谢,

弗罗斯科伊。

4

4 回答 4

6

“将其转换为 int”没有任何开销。在 Java 字节码级别,所有bytes 都已经int是 s。

无论如何,进行数组索引将自动向上转换为int无论如何。这些都不会提高性能,而且许多会降低性能。只需使用int.

JVM 规范,第 2.11.1 节

请注意,表 2.2 中的大多数指令没有整数类型 byte、char 和 short 的形式。没有布尔类型的形式。编译器使用 Java 虚拟机指令对 byte 和 short 类型的文字值的负载进行编码,这些指令在编译时或运行时将这些值符号扩展为 int 类型的值。boolean 和 char 类型的文字值的加载使用在编译时或运行时将文字零扩展为 int 类型的值的指令进行编码。同样,从 boolean、byte、short 和 char 类型的值数组加载是使用 Java 虚拟机指令编码的,这些指令将值符号扩展或零扩展为 int 类型的值。因此,对实际类型 boolean、byte、char 和 short 的值的大多数操作都可以由对计算类型 int 的值进行操作的指令正确执行。

于 2012-09-27T21:48:59.057 回答
3

由于 java 中的所有整数类型都已签名,因此您必须屏蔽掉 b 值的 8 位,前提是您确实希望从文件中读取大于 0x7F 的值:

byte b;
byte a[256];
a [b & 0xFF] = x;
于 2012-09-27T21:48:50.860 回答
0

不; 数组索引是非负整数 (JLS 10.4),但字节索引将被提升。

于 2012-09-27T21:48:37.607 回答
0

不,没有性能下降,因为在您读取字节的那一刻,您有时会将其存储在CPU 寄存器中。这些寄存器始终与WORDs一起使用,这意味着字节始终“转换”为 int (或 long,如果您在 64 位机器上)。

因此,只需像这样读取您的字节:

int b = (in.readByte() & 0xFF);

如果您的应用程序对性能至关重要,那么您应该在其他地方进行优化。

于 2012-09-27T21:49:32.403 回答