2010-09-10 83 views
1

在Java中,我们可以做条件编译像这样条件JIT编译

private static final boolean DO_CHECK = false; 

... 

if (DO_CHECK) { 
    // code here 
} 

编译器将看到DO_CHECK永远是假的,删除整个if语句。但是,有时候,特别是在库代码中,我们不能使用条件编译,但我想知道,我们可以使用条件JIT编译吗?

private final boolean doCheck; 

public LibraryClass(boolean d) { 
    doCheck = d; 
} 


public void oftenCalledMethod() { 
    if (doCheck) { 
     ... 
    } 
} 

如果我们用doCheck = false构造LibraryClass,那么JIT编译器(在Hotspot中)是否会移除if语句?

更新:我刚刚意识到JIT编译很可能没有在实例级别完成,所以我认为这不起作用,但也许有一种静态的方式?

+0

有人可能想知道这样做的实际好处是什么 - 如果编译器没有对JIT编译或“优化”这个特定位,系统资源的实际成本是多少? Java程序中的可执行文件大小是否重要?如果存在JIT的一部分方法(如果这是一个正确的术语),内存使用量会增加吗? – fwielstra 2010-09-10 14:33:12

回答

0

JIT代表“及时”。这意味着东西在虚拟机认为需要它之前编译。因此,根据检查的原子级别,您可能会发现永远不会运行的代码永远不会得到JIT编译。

+0

if里面的代码不会被编译,但是我想知道如果检查本身(这可能很昂贵)被优化掉了。 – 2010-09-10 11:30:33

+2

做一个布尔比较?这不太可能是昂贵的。 – JeremyP 2010-09-10 12:19:08