int vs long比较会损害Java中的性能吗?

tal*_*ees 5 java int comparison long-integer

比较int和long伤害表现?即

int x = 1;
long y = 2;
if (x < y) doStuff();
Run Code Online (Sandbox Code Playgroud)

而不是:

int x = 1;
int y = 2;
if (x < y) ...
Run Code Online (Sandbox Code Playgroud)

是否存在类型转换?或者内存中的位布局是否允许直接比较?(即long中的额外位可以假设为int的0)

dav*_*mac 17

Java语言规范说,二进制数字促销发生,int因此转换为long.在实践中,转换实际上是微不足道的 - 在大多数现代硬件上,这并不是一项昂贵的操作.但是,整个问题不一定是性能问题; 你使用很长时间不是因为性能,而是因为你需要能够管理更大的数值.

和性能问题一样,真正的答案是:

a)在成为问题之前,你不应该担心性能

b)在那个阶段,你应该描绘或进行测量,看看效果是什么.


Gen*_*ene 6

JLS 是一个很好的参考,并且明确了类型提升的要求,但没有人谈到本质问题。

在机器级别(JIT 编译后或深入到 JVM 中),具有 64 位 ALU 的处理器可能会使用一条指令进行 64 位到 32 位比较,以对 32 位操作数进行符号扩展和一秒钟进行 64 位宽的比较,然后是围绕doStuff调用的分支。

对于intint32 位的比较,可以省略符号扩展。因此,现代内核的区别在于一条指令或一个周期。

如果机器有 32 位 ALU,那么 64 位比较大概需要 4 条指令:比较、分支、测试、分支。但它可能会在 3(带借位、子、分支)中使用正确的指令和/或额外的寄存器来完成。

intint需要两个:比较和分支。所以区别是 1 或 2 个指令/周期。

很少有程序可以通过 1 或 2 个周期产生有意义的性能差异。使用您需要的类型来确保您的程序能够在未来十年左右的所有意外情况下运行。忘记几个周期。

NB 64 位实际上会导致有意义的性能下降是将数据结构(以及较小程度的代码)大小膨胀 2 倍,从而使缓存和页面未命中变得更加频繁。但同样,您不应该提前担心这一点。

不幸的是,Java 无法为未装箱的类型设置别名。从inttolongfloattodouble和 back 的变化并非微不足道:在许多情况下都是严重的语言缺陷。