Java 创建新变量并将其传递给函数与直接传递求值

Java 创建新变量并将其传递给函数与直接传递求值,java,optimization,Java,Optimization,下面是2段代码片段-> 1 Position bulletPosition = new Position(turretPosition); float offsetX = turretSprite.getHeight() + (38 * MathUtils.cos(MathUtils.degreesToRadians * turretPosition.getAngle()) - 41); float offsetY = turretSprite.getW

下面是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中,我创建了两个浮点变量,然后将它们作为参数传递给addX和addY函数

在代码段2中,我不是创建浮点,而是将求值作为参数传递

现在让我们假设这个代码段是一个函数的一部分,用户每次按某个键(即非常快)时都会调用该函数

现在我的问题是,这是否意味着在代码段1中,我们将一次又一次地创建新的浮动,而在代码段2中不会发生这种情况?或者两种情况都相同


我喜欢snippet one,因为它更简洁,但我想知道这两段代码之间是否有区别?我一直在想这个问题,今天就想问一下

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

如果
offsetX
offsetY
的值被多次使用,那么从理论上讲,您将领先于Snippet 1,但同样,优化编译器应该缓存它们


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

用户“每次按某个键(即非常快)。”-在大多数常见情况下,用户输入被认为是“非常罕见”的事件(例如,我怀疑你每秒击键1000次)当你做了<代码> ADDX(表达式)< /C>时,它将计算表达式并将其放在内部变量中,然后使用这个变量作为参数。边注:考虑添加语言标记(如果提到C++,则提及编译器),也可以通过Eric Lippert检查来改进“什么是更快”的问题。@ AlexeiLevenkov:它似乎是java,这种语法在C++中没有使用。与任何半象素优化编译器不应有任何区别。然而,当有疑问时,在一个紧密的循环中测量一些时间,看看它在您的特定环境/案例中如何发挥。感谢您不是一个欺负者,并给出了相关的满分答案:D