我的问题是:如果我从 Java 反汇编中得到它,当我使用
byte a=3,b=5;
System.out.println(a+b);
实际上会使用 int 而不是 byte。此外,所有本地内存插槽都是 4B,就像堆栈插槽一样。我意识到分配一个字节数组可能会更有效,但是使用单个字节值最终是低效的吗?(简称同点)
+
是整数运算。因此
byte c = a+b; // compile error
你应该使用
int c = a + b
或者
byte c = (byte)(a+b);
我的建议是使用int
,以免每次都施放。如果你总是处理byte
使用字节,否则使用int
重要的是要意识到在 Java 中存在byte
并且short
主要不是具有较小范围的整数数据类型。在几乎所有存储(足够小的)数值的情况下,int
都会使用 an,即使有效范围仅为 0-100。
byte
并且short
在某些外部因素将要处理的数据限制在这些范围内时使用。它们只是为了简化与此类系统的交互而存在。
例如,如今的文件系统存储字节流。您可以使用int
所有这些读/写操作,但是拥有byte
数据类型可以简化操作并使这种区别变得明确。
性能调优的第一条规则应该是编写简单、清晰的代码。
在此示例中,没有性能差异,即使 println() 需要 10,000 倍的时间,也不会产生任何差异。
程序在字节码中的出现方式和在本机代码中的出现方式是不同的。
在 JVM 中,并非所有插槽都是 4 字节。例如,64 位机器上的引用可以是 8 字节,但它仍然使用一个“插槽”
您的机器没有插槽。它确实具有通常为 32 位或 64 位的寄存器。
在您的示例中,使用了字节操作,它与 int 操作一样有效,并且可以产生不同的结果,因此仍然需要它们。
注意:带有byte
或short
字段的对象可以小于带有int
字段的对象。
在这个例子中,JVM 可以计算c
一次,所以它不需要a
或b
声明byte a=3,b=5;
这样final byte a=3,b=5;
当这个语句byte c = a+b;
将被执行时它不会被byte
执行int
。
定义低效。
是的,内存占用似乎效率低下,但请记住,当今的大多数处理器都是 32 位(甚至是 64 位)。仅以 8 位存储一个字节将需要处理器获取 32 位地址空间并对其进行移位和清理,以便将必要的 8 位放在正确的位置。