javahotspot编译器是否会删除涉及示例变量final state的死代码

dldeef67  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(244)

在下面的代码中,很明显baa总是false。热点编译器是否会发现这一点并删除isbaa()方法调用和包含的代码?

public class Foo() {
    public final boolean baa = false;
    public isBaa() {
        return baa;
    }
}

像这样的用法

static final Foo foo = new Foo();

public m() {
    if (foo.isBaa()) {
        // code here...
    }
}

我想知道这段代码是否与

static final Foo foo = new Foo();
static final BAA = foo.isBaa();

并与

if (BAA) ...

对热点完成任务后的运行速度感兴趣。到底有没有办法真正看到热点编译的结果呢?或者我们必须从正在使用的热点编译器的实现细节中推断。
用例是在性能非常敏感的代码中通过最后一个变量来支持isdebugenabled()。所以我感兴趣的是方法调用本身是否经过了优化。

mrwjdhj3

mrwjdhj31#

回答我自己的问题。。。
我用计时来衡量hotspot何时完全摆脱了代码。i、 如果循环中的代码没有给循环执行时间增加更多的时间,那么它就被编译出来了。
静态最终布尔检查可以完全编译出来。
静态方法调用可以编译出来。
示例方法,即使标记为final,也不是。
在我对ibmjdk8的测试中,最后一个什么都不做的方法调用花费了大约6个时钟周期。
来自ibm的hotspot文档意味着最终示例方法可以内联,但是测试表明仍然有成本。我想未来的虚拟机可能会进一步优化这个。
在我的测试中,热点编译似乎也会影响循环在cpu内核中的分布。

for(; i < Integer.MAX_VALUE ; i++)

神奇地运行在所有4个CPU上(平均时间为时钟周期的1/4)

for(; i < Integer.MAX_VALUE ; i++) if (false) ...

平均需要1个时钟周期
因此,即使热点编译为空的代码也会影响周围代码的优化。

相关问题