內聯是由Java Just-In-Time編譯器執行的優化。
如果你有一個方法:
public int addPlusOne(int a, int b) {
return a + b + 1;
}
,你這樣調用:
public void testAddPlusOne() {
int v1 = addPlusOne(2, 5);
int v2 = addPlusOne(7, 13);
// do something with v1, v2
}
編譯器可能會決定更換你的函數調用的函數體,這樣的結果將實際看起來是這樣的:
public void testAddPlusOne() {
int v1 = 2 + 5 + 1;
int v2 = 7 + 13 + 1
// do something with v1, v2
}
編譯器會這樣做以節省開銷o f實際上正在進行函數調用,這將涉及將每個參數推送到堆棧。
這顯然只能用於非虛擬功能。考慮如果方法在子類中被覆蓋並且包含該方法的對象的類型在運行時才知道,會發生什麼......編譯器如何知道要複製的代碼:基類的方法體或子類方法體?由於Java中默認所有方法都是虛擬的,因此可以明確標記那些不能被覆蓋的方法(或將它們放入final
類中)。這將幫助編譯器確定該方法永遠不會被覆蓋,並且內聯是安全的。 (請注意,編譯器有時也會對非最終方法做出此確定。)
另請注意,單詞可能是的引用。最終的方法不保證是可以接受的。有多種方法可以保證方法不能被內聯,但沒有辦法使編譯器內聯。無論如何,當內聯有助於緩解代碼的速度時,它幾乎總是會比你更清楚。
請參閱wikipedia以獲得有關優點和問題的良好概述。
這將是幫助:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html#vm – codaddict 2010-10-13 15:01:58