5

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

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关键字是否会影响它?

谢谢!

4

3 回答 3

7

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

在内存方面没有。但是final保证在你处理对象的情况下,整个执行引用不能指向其他对象(如果是原始类型,final保证该变量的值不会在整个执行过程中改变)

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

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

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

于 2012-10-25T03:47:18.413 回答
3

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

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

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

对象 mSprite 的内存是在堆内存中创建的。并且在选项(1)和(2)中为这个对象分配多少内存没有区别

所以 (1) 和 (2) 之间的唯一区别是 (1) 在堆栈上创建了更多内存。一旦退出执行此函数的方法,就会检索到它。

于 2012-10-25T03:59:21.900 回答
1

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

于 2012-10-25T05:36:07.753 回答