想象一下这些版本中的一个函数:
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
唯一的区别是变量temp
声明一次又一次地在第一个版本的循环,而它的声明,一旦在第二个版本外循环。无论重要性如何,结果字节码是否有任何差异?编译器是如何处理这种情况的,第二个版本是否可以视为优化后的第一个版本?
在字节码级别根本没有声明变量(忽略关于调试元数据的通常警告)。相反,每个方法都有一个包含多达 65,535 个“槽”的表,字节码可以从中存储和检索值。编译器将为每个变量分配一个槽,确保不会为活跃范围重叠的变量重用槽。
所以,在你的榜样,我希望唯一的差异是temp
和i
不同的顺序得到分配的时隙,但字节码,否则相同。
话虽如此,这比您想象的更无关紧要,因为字节码不是 JVM 执行的(大部分时间)。相反,它只是一种抽象。对于性能真正重要的任何代码,JVM 将对您的代码进行静态分析,然后对其进行优化并将其编译为本机代码,因此字节码编码中的微小差异无论如何都完全没有意义。
归档时间: |
|
查看次数: |
124 次 |
最近记录: |