创建新变量然后将它们传递给函数vs直接传递评估

时间:2016-01-01 01:54:32

标签: java optimization

以下是2个代码段 - >

1

Position bulletPosition = new Position(turretPosition);     
        float offsetX = turretSprite.getHeight() + (38 * MathUtils.cos(MathUtils.degreesToRadians * turretPosition.getAngle()) - 41);
        float offsetY = turretSprite.getWidth()/2 + (38 * MathUtils.sin(MathUtils.degreesToRadians * turretPosition.getAngle()));

        bulletPosition.addX(offsetX).addY(offsetY);

2

Position bulletPosition = new Position(turretPosition);     

        bulletPosition
        .addX(turretSprite.getHeight() + (38 * MathUtils.cos(MathUtils.degreesToRadians * turretPosition.getAngle()) - 41))
        .addY(turretSprite.getWidth()/2 + (38 * MathUtils.sin(MathUtils.degreesToRadians * turretPosition.getAngle())));

在代码段1中,我创建了2个浮点变量,然后将它们作为参数传递给addX和addY函数。

在代码段2中,我没有创建浮点数,而是将评估作为参数传递。

现在让我们说这个片段是一个函数的一部分,每当用户按下某个键时(即非常快),就会调用该函数。

现在我的问题是 Snippet 1 是否意味着我们会一次又一次地创建新的花车,并且它不会在 Snippet 2 中发生?或者两种情况都是一样的。

我喜欢片段,因为它更干净但我想知道这两段代码之间是否有区别?我总是想到这一点,并想到今天问它。

1 个答案:

答案 0 :(得分:2)

理论上,Snippet 1中的2个局部变量对应于在堆栈上分配更多空间,以及对于addXaddY函数调用的那些堆栈位置的额外读取访问。给定优化编译器,两个片段的执行时间可能相同。

如果offsetXoffsetY的值被多次使用,理论上你将领先Snippet 1,但同样,优化编译器应该缓存它们。

可以说,主要区别在于性能 - 它的可读性和可维护性。