如果我不在Java中使用局部变量,那么速度有多快或节省空间

时间:2018-03-23 06:47:47

标签: java compiler-construction jvm

我想知道这两种方法是否有任何不同。

private int getSum(int a, int b) {
    int total = a + b;
    return total;
}

private int getSum2(int a, int b) {
    return a+b;
}

我学到的是编译器或解释器会自动优化它。是不是?

1 个答案:

答案 0 :(得分:1)

这种差异将存在于字节代码中,它的影响当然取决于实现。

您的附加int变量不能使用具有析取范围的另一个变量的空间,因此在字面上执行(解释)时,它会将堆栈帧的所需大小提高四个字节。但是,像广泛使用的HotSpot JVM这样的环境在启动时会预先分配线程的整个堆栈空间,并且不支持调整大小,因此使用此实现时,本地变量根本不会影响内存消耗。

您可能会想说,如果您将一个局部变量添加到递归方法中,则额外所需的内存可能会累加,通过一些调用(在解释模式下)减少最大递归深度,但正如{ {3}},最大递归深度已经存在不确定性。

该答案还演示了编译/优化对所需堆栈跟踪的影响,在示例中将所需的堆栈空间减少了6倍。当您的方法成为热点时,优化器会查看它,其框中的一个工具是this answer的转换,知道变量,这些变量用于模拟数据传输。换句话说,在中间表示中已经消除了这些变体之间的差异。从那里开始,这些值很可能在生成本机代码时映射到CPU寄存器,因此结果根本不需要堆栈空间。

虽然每次操作与调用者所做的任何操作融合时,这样一个小方法都会被调用到调用者中,甚至更有可能,导致代码只能通过查看方法来预测。在任何一种情况下,无论您是否使用临时局部变量,都是无关紧要的。