java如何优化?示例代码
How does java optimisation? Example code
考虑这个小 class:
public class Example {
public int plus(int a){
int b;
b = 1;
return b+a;
}
}
javap 说:
public int plus(int);
descriptor: (I)I
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=2
0: iconst_1
1: istore_2
2: iload_2
3: iload_1
4: iadd
5: ireturn
LineNumberTable:
line 4: 0
line 5: 2
我不明白为什么我们需要第 1 行和第 2 行?
听说Java运行时环境会统计函数调用次数,如果超过一定次数就会编译函数。
这是否意味着 Java 编译器将所有优化都留给了字节码编译器?例如。 Java 程序启动缓慢并随时间变快?
请说明!
首先,您正在查看字节码编译器的输出。典型的 Java 字节码编译器做的优化很少。重量级优化是由 JIT 编译器完成的……在运行时。
所以你看到 javap -c
显示的是未优化的字节码。
I don't understand why we need line 1&2?
您正在查看未优化的字节码。前 2 条指令将 1
赋值给局部变量 b
。我们可以看到局部变量很容易被优化掉。但是字节码编译器 (javac
) 并不介意。
I heard that the Java Runtime environment counts function calls and compiles functions if they exceed a certain number of calls.
典型的 Hotspot JVM 就是这样工作的。
Does that mean that the Java compiler leaves all optimisation to the byte code compiler?
没有。执行运行时编译和相关优化的是 JIT 编译器。
字节码编译器将Java源代码编译成字节码。 JIT 编译器在运行时将字节码编译为本机代码。
E.g. Java programs start slow and become faster by time?
没错。初始字节码解释阶段和 JIT 编译是所谓 "JVM warmup".
的一部分
(应要求...)
字节码编译器没有优化的原因包括:
- 因为 JIT 编译器 会 优化(所以会白费力气),
- 因为优化字节码可能使得在 JIT 编译器中更难优化("clever"代码比简单代码更难优化),并且
- 因为未优化的字节代码使探查器或调试器更容易将代码关联回源代码行。
JIT 编译器进行优化的原因包括:
- 因为需要在生成native代码的步骤中完成才能达到最佳效果,
- 因为它依赖于平台(例如,最佳代码取决于目标指令集,并可能取决于内存缓存大小、内核数量等),并且
- 因为它允许您根据代码在执行时观察到的行为进行优化(例如改进分支预测)。
最后,JIT 编译非常适合 Java 的后期绑定模型。
考虑这个小 class:
public class Example {
public int plus(int a){
int b;
b = 1;
return b+a;
}
}
javap 说:
public int plus(int);
descriptor: (I)I
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=2
0: iconst_1
1: istore_2
2: iload_2
3: iload_1
4: iadd
5: ireturn
LineNumberTable:
line 4: 0
line 5: 2
我不明白为什么我们需要第 1 行和第 2 行?
听说Java运行时环境会统计函数调用次数,如果超过一定次数就会编译函数。
这是否意味着 Java 编译器将所有优化都留给了字节码编译器?例如。 Java 程序启动缓慢并随时间变快?
请说明!
首先,您正在查看字节码编译器的输出。典型的 Java 字节码编译器做的优化很少。重量级优化是由 JIT 编译器完成的……在运行时。
所以你看到 javap -c
显示的是未优化的字节码。
I don't understand why we need line 1&2?
您正在查看未优化的字节码。前 2 条指令将 1
赋值给局部变量 b
。我们可以看到局部变量很容易被优化掉。但是字节码编译器 (javac
) 并不介意。
I heard that the Java Runtime environment counts function calls and compiles functions if they exceed a certain number of calls.
典型的 Hotspot JVM 就是这样工作的。
Does that mean that the Java compiler leaves all optimisation to the byte code compiler?
没有。执行运行时编译和相关优化的是 JIT 编译器。
字节码编译器将Java源代码编译成字节码。 JIT 编译器在运行时将字节码编译为本机代码。
E.g. Java programs start slow and become faster by time?
没错。初始字节码解释阶段和 JIT 编译是所谓 "JVM warmup".
的一部分(应要求...)
字节码编译器没有优化的原因包括:
- 因为 JIT 编译器 会 优化(所以会白费力气),
- 因为优化字节码可能使得在 JIT 编译器中更难优化("clever"代码比简单代码更难优化),并且
- 因为未优化的字节代码使探查器或调试器更容易将代码关联回源代码行。
JIT 编译器进行优化的原因包括:
- 因为需要在生成native代码的步骤中完成才能达到最佳效果,
- 因为它依赖于平台(例如,最佳代码取决于目标指令集,并可能取决于内存缓存大小、内核数量等),并且
- 因为它允许您根据代码在执行时观察到的行为进行优化(例如改进分支预测)。
最后,JIT 编译非常适合 Java 的后期绑定模型。