有临时变量或无临时变量的数字交换性能差异

时间:2019-03-28 23:15:27

标签: java performance

在互联网的深处,我发现了以下post

  

不使用新变量交换两个数字始终是一个好方法。这有助于您的应用程序以内存和性能为导向。

并建议使用以下代码:

int firstNum = 10;
int secondNum = 20;

firstNum = firstNum + secondNum;
secondNum = firstNum - secondNum;
firstNum = firstNum - secondNum;

代替使用临时变量。

说实话,对我来说,这听起来像一大堆鲍尼。我知道,在实际环境中,这种微调整几乎没有什么区别,但是令我着迷的是,如果在这种情况下避免使用新变量,会产生任何差异吗?

4 个答案:

答案 0 :(得分:4)

这不仅是一个可怕的想法,甚至不是一个可怕想法的好的实现!老把戏去了:

a^=b;
b^=a;
a^=b;

那将不会有下溢/上溢的问题,并且确实会使您的同事更加困惑。我的意思是,如果您要使代码混乱,性能不佳……请继续!

顺便说一句,如果您认为以一种不太明显的方式进行操作可能会获得一些性能上的好处,我通常会用Java来说,永远不要这样做。首先,您可能错了,您的解决方案也不会很快。其次,java已经快了,这可能没关系。第三,随着时间的流逝,java将改进“显而易见”的方法,并使用运行时编译器使其变得更快。它不会改善您的骇客,甚至可能使其变慢。

如果您不相信我,您可能仍然相信每次连接两个字符串时都应该使用stringbuilder ...

答案 1 :(得分:3)

那是一堆鲍尼酒;这样的提示仅对早期计算机(具有严格的寄存器限制)没有任何价值。在现代计算机上,这不是问题。使用临时变量(建议使用可读性更好的代码)。

答案 2 :(得分:1)

不要紧要紧,如果没有temp变量的任何操作都是3次操作,而只有temp变量的只有2次操作。

答案 3 :(得分:1)

public class SwapTest {

    int firstNum = 10;
    int secondNum = 20;

    public static void main(String args[])
    {
        SwapTest swap2Numbers = new SwapTest();
        long before = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            swap2Numbers.proceedNoInterimVariable();
        }
        System.out.println(" no temp variable took " + (System.currentTimeMillis()-before));

        before = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            swap2Numbers.proceedWithInterimVariable();
        }
        System.out.println("with temp variable took " + (System.currentTimeMillis()-before));
    }

    private void proceedNoInterimVariable()
    {

        firstNum = firstNum + secondNum;
        secondNum = firstNum - secondNum;
        firstNum = firstNum - secondNum;
    }

    private void proceedWithInterimVariable()
    {
        int temp = firstNum;
        firstNum = secondNum;
        secondNum = temp;
    }

}

在我的系统上,temp变量版本的执行速度要快得多。

 no temp variable took 11
 with temp variable took 4