我对JIT优化有疑问。 我编译了一段简单的代码:
class btest
{
static final boolean flag=false;
public final void foo(int x)
{
if(flag) {a=x; b=x*2; c=x*3;}
}
public void bar(int y) {foo(y);}
int a,b,c;
};
flag
设置为false
,因此foo()
完全编译为空代码 - 只返回。
但bar()
仍然称之为。
JIT是否可以取消此通话?
flag
属于外部类是否重要?
问候
答案 0 :(得分:4)
它可以消除它并在代码中内联它。
注意:它也可以为非易失性非最终变量执行此操作,它认为线程不会更改该值。一个常见的错误就像是
boolean running = true;
public void run() {
while(running) {
// do something
}
}
public void stop() {
running = false;
}
一个常见的误解是线程可能会保持运行一段时间但在某个未知点停止,而实际上JIT可能内联running
并且永远不会停止。
答案 1 :(得分:1)
JIT编译器很可能会消除这种情况。
但实际上,我认为if
语句可能会在之前之前进行优化。原因是在JLS 14.21开头就是这样说的:
“但是,为了使if语句能够方便地用于”条件编译“,实际规则会有所不同。”
如果继续说编译器(即字节码编译器!)可能会在您的示例中生成不同的代码,具体取决于编译时条件的已知值。
请注意,此特殊处理仅适用于if
语句,并且仅当条件为常量表达式时才适用。 (该术语具有非常特定的含义 - 请参阅JLS 15.28)例如,如果您尝试使用while
循环执行相同的“技巧”,则会收到编辑错误,抱怨无法访问的代码。
(这种“条件编译”特殊处理可以追溯到Java的早期,并且是Gosling 等决定不在Java语言中包含预处理器的理由的一部分。 )