2010-09-10 187 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