2010-10-13 20 views
31

Bunun ne anlama geldiğini anlamaya çalışıyorum:Yöntem inlinleme nedir?

satır içi işlevi C++, sınıf bildirimi tanımlanan üye fonksiyonunda

. (2) Bir işlevi, derleyicinin işlev için gerçek kodu ile değiştirdiği anlamına gelir. anahtar sözcüğündeki satır içi, bir üyenin gövdesinin genişlemesini veya kayıt dışı işlevini gerçekleştirmek için derleyiciyi derlemesine ipucu vermek için kullanılabilir.

inline

derleme sırasında işlevin kodunun bir kopyasını ile bir işlev çağrısı değiştirin.

bir yöntem kesindir

, bu inlined çekebilir:

Örneğin şöyle birşeyler yazılır. İşte

: http://www.roseindia.net/javatutorials/final_methods.shtml

sen bana bir örnek veya bir şey vermek veya temelde demektir "o satır içine yerleştirilmiş olabilir" anlamak için bana yardımcı olabilir.

Teşekkürler.

+1

Bu yardımcı olacaktır: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html#vm – codaddict

cevap

49

Inlining, Java Just-In-Time derleyicisi tarafından gerçekleştirilen bir optimizasyondur.

Eğer bir yöntemi varsa:

public int addPlusOne(int a, int b) { 
    return a + b + 1; 
} 

böyle diyoruz:

public void testAddPlusOne() { 
    int v1 = addPlusOne(2, 5); 
    int v2 = addPlusOne(7, 13); 

    // do something with v1, v2 
} 

derleyici fonksiyon gövdesinde ile işlev çağrısını yerine karar verebilir, bu nedenle sonuç olurdu etkin olarak şu şekilde görün:

public void testAddPlusOne() { 
    int v1 = 2 + 5 + 1; 
    int v2 = 7 + 13 + 1 

    // do something with v1, v2 
} 

Derleyici bu ek yükü kaydetmek için yapar f aslında her bir parametreyi yığına yerleştirmeyi gerektiren bir işlev çağrısı yapmak.

Bu, yalnızca sanal olmayan işlevler için açıkça yapılabilir. Yöntem bir alt sınıfta geçersiz kılındığında ve yöntemi içeren nesnenin türü çalışma zamanına kadar bilinmezse ne olacağını düşünün ... derleyici hangi kodu kopyalamak gerektiğini bilir: temel sınıfın yöntem gövdesi veya alt sınıfın yöntem gövdesi? Tüm yöntemler Java'da varsayılan olarak sanal olduğundan, final olarak geçersiz kılınamayanları açıkça işaretleyebilir (veya bunları bir final sınıfına yerleştirebilirsiniz). Bu, derleyicinin yöntemin hiçbir zaman geçersiz kılınmayacağını ve satır içi için güvenli olduğunu anlamaya yardımcı olacaktır. (Derleyici bazen son belirsiz yöntemler için bu belirleme yapabilir. Not

Ayrıca, alıntıda sözcüğü olabilir. Son yöntemlerin belirsiz olması garanti edilmez. Bir yöntemin satır içine girme yeteneğine sahip olmadığını garanti edebilmenizin çeşitli yolları vardır, ancak zorlayıcı zorlayıcı için inline. Inlining sonuçta ortaya çıkan kodun hızını zedelemeye yardım edeceği zaman neredeyse her zaman sizden daha iyi bilen olacaktır.

Avantaj ve sorunlara genel bir bakış için wikipedia'a bakın.

+10

10 İyi bir cevap, ama bir not olarak: Son * olmayan bir yönteme sahipseniz, * geçersiz kılmazsanız, iyi bir JIT bunu anlayabilir ve hatta satır içinde hizalayabilir. Daha sonra geçersiz kılan bir sınıf yüklerseniz, satır içi çizgiyi geri alabilirsiniz. – naiad

+0

İyi nokta, cevap gövdesine ekledim. –

+0

Çok açıklayıcı, bu harika cevap için teşekkürler. – Tarik

9

Diyelim ki şöyle bir sınıf var diyelim:

public class Demo { 
    public void method() { 
     // call printMessage 
     printMessage(); 
    } 

    public void printMessage() { 
     System.out.println("Hello World"); 
    } 
} 

printMessage çağrısı şu şekilde "inlined" olabilir: (Bu aslında bitmiş değil

public class Demo { 
    public void method() { 
     // call printMessage 
     System.out.println("Hello World"); // <-- inlined 
    } 

    public void printMessage() { 
     System.out.println("Hello World"); 
    } 
} 

Java seviyesi (bytecode seviyesinde bile değil) ancak JIT derleme sırasında yukarıdaki örnek inlining kavramını gösterir.)

Şimdi ne olacağını düşünün printMessage yöntem böyle başka bir sınıfta tarafından aşırı eğer:

derleyici nesne aslında bir ihtimaline karşı yanlış olur o System.out.println("Hello World"); ile sıkışmış olacak Demo.printMessage çağrısına inlined Şimdi eğer
class SubDemo extends Demo { 
    public void printMessage() { 
     System.out.println("Something else"); 
    } 
} 

SubDemo örneği. Ancak, yöntem final olarak bildirilmişse, bu durum hiçbir durumda geçerli olmayacaktır. Eğer metot "nihai" ise, bunun yeni bir tanımla asla geçersiz kılınamayacağı anlamına gelir, bu yüzden, onu satır içi tutmak güvenlidir!

+0

Ayrıca iyi bir cevap, ama başka bir cevaptan kopyalanan bir not olarak: geçersiz kılmayan son olmayan bir yöntem, iyi bir JIT bunu anlayabilir ve hatta satır içi. Daha sonra geçersiz kılan bir sınıf yüklerseniz, satır içi çizgiyi geri alabilirsiniz. – naiad

+0

Çok açıklayıcı, bu harika cevap için teşekkürler. – Tarik

10

Bir işlevin çağrılması ücretsiz değildir. Makine, aranan işlev tamamlandığında, kodun çağıran bölümüne geri dönebilmesi için bir yığın çerçeveyi korumalıdır. Yığının bakımı (bu yığının üzerinde geçen fonksiyon parametrelerini içerir) zaman alır.

Bir işlev dizeli olduğunda, derleyici işlevi işlev koduyla işlevin yerini alır ve böylece işlev çağrısı sırasında işlev çağrısının performansının düşmesini önleyebilir. Bu, programlamadaki klasik satış noktalarından biridir: çalışma zamanı kodu biraz daha büyük olur (daha fazla bellek alır), ancak biraz daha hızlı çalışır.

+0

Teşekkürler. İlk paragrafta, gerçekten haklısınız. – Tarik

İlgili konular