Inlineing to optymalizacja wykonywana przez kompilator Java Just-In-Time.
Jeśli masz metodę:
public int addPlusOne(int a, int b) {
return a + b + 1;
}
którą nazywamy tak:
public void testAddPlusOne() {
int v1 = addPlusOne(2, 5);
int v2 = addPlusOne(7, 13);
// do something with v1, v2
}
kompilator może zdecydować się zastąpić wywołanie funkcji z ciałem funkcji, więc wynik byłby efektywnie wyglądają tak:
public void testAddPlusOne() {
int v1 = 2 + 5 + 1;
int v2 = 7 + 13 + 1
// do something with v1, v2
}
Kompilator robi to, aby zapisać obciążenie o f faktycznie wykonuje wywołanie funkcji, co wymagałoby popychania każdego parametru do stosu.
Można to wyraźnie zrobić tylko dla funkcji innych niż wirtualne. Zastanówmy się, co by się stało, gdyby metoda została przesłonięta w klasie podrzędnej, a typ obiektu zawierającego metodę nie jest znany do czasu wykonywania ... w jaki sposób kompilator wie, co kod skopiować: ciało metody klasy podstawowej lub podkategorie ciało metody? Ponieważ wszystkie metody są domyślnie wirtualne w Javie, można jawnie oznaczyć te, które nie mogą zostać zmienione jako final
(lub umieścić je w klasie final
). Pomoże to kompilatorowi zorientować się, że metoda nigdy nie zostanie przesłonięta i jest bezpieczna w inline. (Zauważ, że kompilator może czasami dokonać tego określenia także dla metod nieostatecznych.)
Należy również zwrócić uwagę na słowo w cytacie ze słowem. Ostateczne metody nie gwarantują, że są nieodczuwalne. Istnieją różne sposoby zagwarantowania, że metoda nie może być zainicjowana, ale nie ma możliwości, aby wymusić na kompilatorze inline. Będzie prawie zawsze wiedzieć lepiej niż ty, gdy inlining pomoże vs zranić szybkość wynikowego kodu.
Aby uzyskać pełen przegląd korzyści i problemów, zobacz stronę wikipedia.
To będzie pomocne: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html#vm – codaddict