java short,integer,long performance

bob*_*bob 13 java performance integer short long-integer

我读到JVM存储内部短,整数和长4个字节.我从2000年的一篇文章中读到它,所以我不知道它现在是多么真实.

对于较新的JVM,使用short over integer/long是否有任何性能提升?自2000年以来,实施的这一部分是否发生了变化?

谢谢

Oli*_*ier 15

整数类型存储在许多字节中,具体取决于确切的类型:

  • 8位字节
  • 16位短路,签名
  • int为32位,已签名
  • 长64位,签名

请参阅此处规格.

至于性能,它取决于你正在做什么.例如,如果要将字面值分配给字节或短字节,则它们将被升级为int,因为默认情况下文字值被视为int.

byte b = 10;  // upscaled to int, because "10" is an int
Run Code Online (Sandbox Code Playgroud)

这就是为什么你做不到的原因:

byte b = 10;
b = b + 1;  // Error, right member converted to int, cannot be reassigned to byte without a cast.
Run Code Online (Sandbox Code Playgroud)

因此,如果您计划使用字节或短路来执行某些循环,那么您将无法获得任何收益.

for (byte b=0; b<10; b++) 
{ ... } 
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您使用字节或短路数组来存储某些数据,您显然会从缩小的尺寸中受益.

byte[] bytes = new byte[1000];
int[] ints = new int[1000];  // 4X the size
Run Code Online (Sandbox Code Playgroud)

所以,我的答案是:这取决于:)


Jon*_*onH 13

long  64 –9,223,372,036,854,775,808 to 9 ,223,372,036,854,775,807 
int   32 –2,147,483,648 to 2,147,483,647 
short 16 –32,768 to 32,767 
byte   8 –128 to 127 
Run Code Online (Sandbox Code Playgroud)

使用你需要的东西,我认为由于范围较小而很少使用短裤,而且它采用大端格式.

任何性能提升都是最小的,但就像我说的那样,如果你的应用程序需要的范围比使用int的短范围更大.长型对你来说可能太大了; 但这一切都取决于你的申请.

如果您对空间(内存)有顾虑,则应该只使用short,否则使用int(在大多数情况下).如果你正在创建数组,那么通过声明int和short类型的数组来尝试它.Short将使用1/2的空间而不是int.但是如果你根据速度/性能运行测试,你将看到很少甚至没有区别(如果你正在处理数组),此外,你唯一能节省的是空间.

也是评论员提到的很长,因为长是64位.您将无法以4个字节存储长的大小(请注意长的范围).

  • Long不是"通常"被认为是8个字节,它被定义为64位.它总是64位. (6认同)
  • @KitHo:如果每个字节有8位,则不一定如此(http://en.wikipedia.org/wiki/Byte) (6认同)

Mic*_*rdt 8

这是一个实现细节,但出于性能原因,大多数JVM都会为每个变量使用一个完整的单词(或更多),因为CPU以字为单位访问内存.如果JVM将变量存储在子字单元和位置中,它实际上会更慢.

这意味着32位JVM将使用4个字节(甚至是布尔值),而64位JVM将使用8个字节.但是,对于数组元素也是如此.

  • 对于常规变量,short 既不节省空间也不节省 int 性能(在 32 或 64 位 JVM 上)。对于数组,很难说,因为将 short 转换为字并返回所需的额外 CPU 命令很容易被更好的缓存行为所抵消,因为数据大小更小。 (2认同)