我想知道这两种方法是否有任何不同。
private int getSum(int a, int b) {
int total = a + b;
return total;
}
private int getSum2(int a, int b) {
return a+b;
}
我学到的是编译器或解释器会自动优化它。是不是?
答案 0 :(得分:1)
这种差异将存在于字节代码中,它的影响当然取决于实现。
您的附加int
变量不能使用具有析取范围的另一个变量的空间,因此在字面上执行(解释)时,它会将堆栈帧的所需大小提高四个字节。但是,像广泛使用的HotSpot JVM这样的环境在启动时会预先分配线程的整个堆栈空间,并且不支持调整大小,因此使用此实现时,本地变量根本不会影响内存消耗。
您可能会想说,如果您将一个局部变量添加到递归方法中,则额外所需的内存可能会累加,通过一些调用(在解释模式下)减少最大递归深度,但正如{ {3}},最大递归深度已经存在不确定性。
该答案还演示了编译/优化对所需堆栈跟踪的影响,在示例中将所需的堆栈空间减少了6倍。当您的方法成为热点时,优化器会查看它,其框中的一个工具是this answer的转换,仅知道变量,这些变量用于模拟数据传输。换句话说,在中间表示中已经消除了这些变体之间的差异。从那里开始,这些值很可能在生成本机代码时映射到CPU寄存器,因此结果根本不需要堆栈空间。
虽然每次操作与调用者所做的任何操作融合时,这样一个小方法都会被调用到调用者中,甚至更有可能,导致代码只能通过查看方法来预测。在任何一种情况下,无论您是否使用临时局部变量,都是无关紧要的。