在关于Hotspot中的JIT的讲座中,我想尽可能多地给出JIT执行的特定优化的示例.
我只知道"方法内联",但应该有更多.为每个例子投票.
Java JIT 何时内联方法调用?它是基于#times调用调用方法(如果是,该数字是什么?),或者其他一些标准(那将是什么?)
我已经读过JIT可以内联'final'方法,但它也会根据运行时统计信息内联非最终方法,所以想知道什么是触发条件.
我想答案会因JVM的实现而有所不同,但也许所有这些都有共同之处?
听说Java支持“Loop Unswitching”,所以就在JMH上简单测试了一下。
我认为在 JIT 之后它们会完全相同。为什么是这样?
private final int TIMES = 1_000_000;
private boolean bool;
private Random r = new Random(93);
@Setup(Level.Invocation)
public void fresh() {
bool = r.nextBoolean();
}
@Benchmark
public void test1(Blackhole bh) {
for (int i = 0; i < TIMES; i++) {
if (bool) {
bh.consume(1);
} else {
bh.consume(2);
}
}
}
@Benchmark
public void test2(Blackhole bh) {
if (bool) {
for (int i = 0; i < TIMES; i++) {
bh.consume(1);
}
} else { …Run Code Online (Sandbox Code Playgroud)