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

时间:2012-10-25 03:44:03

标签: 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) - (mSprite.getWidth() / 2)), ((CAMERA_HEIGHT / 2) - (mSprite.getHeight() / 2)));

我能看到的唯一区别是第一个片段是将变量存储在我认为与第二个片段不同的内存区域中,但我对Java内存分配并不是很熟悉(我更多一个C / C ++人)。

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

谢谢!

3 个答案:

答案 0 :(得分:6)

  

在第一个示例中使用final关键字是否会影响它?

在内存方面没有。但final保证在处理对象时,整个执行引用不能指向其他对象(如果基本类型,final保证该变量的值不会因执行而改变)

  

这两个代码片段在内存使用和性能/开销方面是否有任何区别

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

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

答案 1 :(得分:3)

  

这两个代码片段之间有什么区别吗?   内存使用和性能/开销

我会尝试回答第二个问题。但有待纠正。

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

对象mSprite的内存是在堆内存中创建的。在选项(1)和(2)

中为此对象分配的内存没有区别

因此(1)和(2)之间的唯一区别是(1)在堆栈上创建更多内存。只要退出执行此函数的方法,就会检索此信息。

答案 2 :(得分:1)

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