Java 在变量与内联算法中存储数据

Java 在变量与内联算法中存储数据,java,performance,memory-management,Java,Performance,Memory Management,这两段代码在内存使用和性能/开销方面有什么不同吗 final float xPos = (CAMERA_WIDTH / 2) - (mSprite.getWidth() / 2); final float yPos = (CAMERA_HEIGHT / 2) - (mSprite.getHeight() / 2); mSprite.setPosition(xPos, yPos); 另一种情况是: mSprite.setPosition(((CAMERA_WIDTH / 2) - (mSprit

这两段代码在内存使用和性能/开销方面有什么不同吗

final float xPos = (CAMERA_WIDTH / 2) - (mSprite.getWidth() / 2);
final float yPos = (CAMERA_HEIGHT / 2) - (mSprite.getHeight() / 2);
mSprite.setPosition(xPos, yPos);
另一种情况是:

mSprite.setPosition(((CAMERA_WIDTH / 2) - (mSprite.getWidth() / 2)), ((CAMERA_HEIGHT / 2) - (mSprite.getHeight() / 2)));
我能看到的唯一区别是,第一个代码段将变量存储在我认为与第二个代码段不同的内存区域中,但我对Java内存分配不是很熟悉(我更喜欢C/C++)

我的问题是:这样或那样有什么好处?在第一个示例中使用
final
关键字是否会影响它

谢谢大家!

在第一个例子中使用final关键字会影响它吗

就内存编号而言,但
final
保证在处理对象时,整个执行过程中引用不会指向其他对象(如果是基元类型,
final
保证该变量的值在执行过程中不会改变)

这两段代码在内存使用和性能/开销方面有什么不同吗

根据经验,我猜,第一种方法当然会有开销,因为需要创建和维护变量(两种情况下内存使用几乎相同)。尽管有一些开销,但在当前的计算基础设施中,它可以忽略不计

但与第二种方法相比,第一种方法更具可读性和可维护性。让我们把微观优化留给JVM

这两段代码在性能方面有什么不同吗 内存使用和性能/开销

我会尝试回答第二个问题。但必须加以纠正

在第一种情况下,当正在执行的函数运行时,在堆栈上创建两个变量

对象mSprite的内存在堆内存中创建。选项(1)和(2)中为该对象分配的内存量没有区别


所以,(1)和(2)之间的唯一区别是,(1)在堆栈上创建更多内存。执行此函数的方法退出后,将立即检索此函数。

我希望它们完全相同。在这两种情况下,无论如何都需要堆栈来存储中间结果。坦率地说,JIT很可能会内联变量,并使这两个变量完全等效。

浮点的本机存储是80位,因此可能会出现差异,但当它被弹出到内存中时,该值会被截断为60位。可以想象这样一种场景:优化器能够融合并生成FMA(80位融合操作),这在第一种情况下是不可能的。与第一个示例相比,FMA具有更高的精度和更好的性能。但这似乎不太可能,所以我把它作为一个评论:——)谢谢,这是我想的,但得到一个明确的答案很好。