声明一次与重复声明
Declare once vs. repeat declaration
想象一下那些版本中的函数:
static int fibonacciIterative(int n) {
int previous = 0;
int current = 1;
for (int i = 1; i < n; i++) {
int temp = current;
current += previous;
previous = temp;
}
return current;
}
static int fibonacciIterative(int n) {
int previous = 0;
int current = 1;
int temp;
for (int i = 1; i < n; i++) {
temp = current;
current += previous;
previous = temp;
}
return current;
}
唯一的区别是变量temp
在第一个版本的循环中被一次又一次声明,而它被声明一次 在第二个版本的循环外。无论重要性如何,生成的字节码有什么不同吗?编译器如何处理这种情况,第二个版本是否可以被视为优化第一个版本?
变量根本没有在字节码级别声明(忽略有关调试元数据的常见警告)。相反,每个方法都有一个 table 最多 65,535 "slots" 字节码可以从中存储和检索值。编译器将为每个变量分配一个槽,确保不会为具有重叠活跃度范围的变量重用槽。
所以在您的示例中,我希望唯一的区别是 temp
和 i
以不同的顺序分配插槽,但字节码在其他方面是相同的。
话虽如此,这比您想象的更无关紧要,因为字节码不是(大部分时间)由 JVM 执行的。相反,它只是一种抽象。对于任何性能真正重要的代码,JVM 将对您的代码进行静态分析,然后对其进行优化并将其编译为本机代码,因此字节码编码中的微小差异无论如何都是完全没有意义的。
想象一下那些版本中的函数:
static int fibonacciIterative(int n) {
int previous = 0;
int current = 1;
for (int i = 1; i < n; i++) {
int temp = current;
current += previous;
previous = temp;
}
return current;
}
static int fibonacciIterative(int n) {
int previous = 0;
int current = 1;
int temp;
for (int i = 1; i < n; i++) {
temp = current;
current += previous;
previous = temp;
}
return current;
}
唯一的区别是变量temp
在第一个版本的循环中被一次又一次声明,而它被声明一次 在第二个版本的循环外。无论重要性如何,生成的字节码有什么不同吗?编译器如何处理这种情况,第二个版本是否可以被视为优化第一个版本?
变量根本没有在字节码级别声明(忽略有关调试元数据的常见警告)。相反,每个方法都有一个 table 最多 65,535 "slots" 字节码可以从中存储和检索值。编译器将为每个变量分配一个槽,确保不会为具有重叠活跃度范围的变量重用槽。
所以在您的示例中,我希望唯一的区别是 temp
和 i
以不同的顺序分配插槽,但字节码在其他方面是相同的。
话虽如此,这比您想象的更无关紧要,因为字节码不是(大部分时间)由 JVM 执行的。相反,它只是一种抽象。对于任何性能真正重要的代码,JVM 将对您的代码进行静态分析,然后对其进行优化并将其编译为本机代码,因此字节码编码中的微小差异无论如何都是完全没有意义的。