在下面的代码中,很明显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()。所以我感兴趣的是方法调用本身是否经过了优化。
1条答案
按热度按时间mrwjdhj31#
回答我自己的问题。。。
我用计时来衡量hotspot何时完全摆脱了代码。i、 如果循环中的代码没有给循环执行时间增加更多的时间,那么它就被编译出来了。
静态最终布尔检查可以完全编译出来。
静态方法调用可以编译出来。
示例方法,即使标记为final,也不是。
在我对ibmjdk8的测试中,最后一个什么都不做的方法调用花费了大约6个时钟周期。
来自ibm的hotspot文档意味着最终示例方法可以内联,但是测试表明仍然有成本。我想未来的虚拟机可能会进一步优化这个。
在我的测试中,热点编译似乎也会影响循环在cpu内核中的分布。
神奇地运行在所有4个CPU上(平均时间为时钟周期的1/4)
平均需要1个时钟周期
因此,即使热点编译为空的代码也会影响周围代码的优化。