Satır içi genişletme - Inline expansion

İçinde bilgi işlem, satır içi genişlemeveya satır içi, bir manuel veya derleyici optimizasyonu bir işlevin yerini alan arama sitesi çağrılan işlevin gövdesi ile. Satır içi genişletme şuna benzer: makro genişletme, ancak derleme sırasında kaynak kodunu (metin) değiştirmeden oluşur, makro genişletme derlemeden önce gerçekleşir ve daha sonra derleyici tarafından işlenen farklı metinlerle sonuçlanır.

Satır içi oluşturma önemli bir optimizasyondur, ancak performans üzerinde karmaşık etkileri vardır.[1] Olarak temel kural, bazı satır içi işlemleri, çok küçük alan maliyetiyle hızı artıracaktır, ancak satır içi kodun çok fazla tüketilmesi nedeniyle aşırı satır içi kullanımı, hıza zarar verecektir. talimat önbelleği ve ayrıca önemli bir alana mal olur. Jones & Marlow 1999'da 1980'lerden ve 1990'lardan inlineing üzerine mütevazı bir akademik literatür incelemesi verilmiştir.[2]

Genel Bakış

Satır içi genişletme, derleyici işlevin yeni bir kopyasını çağrıldığı her yere yerleştirdiği için makro genişletmeye benzer. Satır içi işlevler, işlev çağırma genel giderleri kaydedildiği için normal işlevlerden biraz daha hızlı çalışır, ancak bir bellek cezası vardır. Bir işlev 10 kez satır içine alınmışsa, koda eklenen işlevin 10 kopyası olacaktır. Bu nedenle satır içi yapmak, sıklıkla çağrılan küçük işlevler için en iyisidir. C ++ 'da, bir sınıfın üye işlevleri, sınıf tanımında tanımlanmışsa, varsayılan olarak satır içine alınır ( Çizgide anahtar kelime); aksi takdirde anahtar kelime gereklidir. Derleyici, programcının bir işlevi satır içi yapma girişimini, özellikle özellikle büyükse, göz ardı edebilir.

Satır içi genişletme, bir işlev çağrıldığında zaman ek yükünü (fazla süre) ortadan kaldırmak için kullanılır. Genellikle sık çalışan işlevler için kullanılır. Aynı zamanda çok küçük işlevler için alan avantajına sahiptir ve diğerleri için etkinleştirici bir dönüşümdür. optimizasyonlar.

Satır içi işlevler olmadan, derleyici hangi işlevleri satır içi yapacağına karar verir. Programcının hangi fonksiyonların satır içi olduğu ve hangilerinin olmadığı üzerinde çok az kontrolü vardır veya hiç kontrolü yoktur. Programcıya bu derecede kontrol vermek, hangi fonksiyonların sıralı olacağını seçerken uygulamaya özel bilginin kullanımına izin verir.

Normalde, bir işlev çağrıldığında, kontrol tanımına bir tarafından aktarılır şube veya çağrı talimatı. Satır içi ile kontrol, bir şube veya çağrı talimatı olmadan doğrudan işlev koduna geçer.

Derleyiciler genellikle uygulamak ifadeler satır içi ile. Döngü koşulları ve döngü gövdelerinin ihtiyacı tembel değerlendirme. Bu özellik, döngü koşullarını ve döngü gövdelerini hesaplayan kod satır içi olduğunda yerine getirilir. Satır içi ifadelerin başka bir nedeni performans değerlendirmeleri.

Bağlamında fonksiyonel programlama dilleri, satır içi genişletmenin ardından genellikle beta azaltma dönüşüm.

Bir programcı, bir işlevi manuel olarak satır içine alabilir. kopyalama ve yapıştırma programlama üzerinde tek seferlik bir işlem olarak kaynak kodu. Bununla birlikte, satır içi kontrolün diğer yöntemleri (aşağıya bakın) tercih edilir, çünkü programcı, satır içi işlevdeki bir hatayı düzeltirken, orijinal işlev gövdesinin (muhtemelen değiştirilmiş) kopyalanmış bir sürümünü gözden kaçırdığında ortaya çıkan hataları hızlandırmazlar.

Performansa etkisi

Bu optimizasyonun doğrudan etkisi, alan kullanımını kötüleştirme pahasına (çağrı ek yükünü ortadan kaldırarak) zaman performansını iyileştirmektir.[a] (Nedeniyle çoğaltılıyor işlev gövdesi). Basit durumlar haricinde, işlev gövdesinin çoğaltılması nedeniyle kod genişlemesi hakimdir,[b] ve dolayısıyla satır içi genişlemenin doğrudan etkisi, yer pahasına zamanı iyileştirmektir.

Bununla birlikte, satır içi genişletmenin birincil yararı, daha büyük işlevlerde daha iyi optimizasyon mümkün olduğundan, işlev gövdesinin boyutunun artması nedeniyle daha fazla optimizasyona ve iyileştirilmiş programlamaya izin vermektir.[3] Satır içi genişletmenin hız üzerindeki nihai etkisi, bellek sisteminin performansı üzerindeki birden çok etkiye bağlı olarak karmaşıktır (öncelikle talimat önbelleği ), modern işlemcilerde performansa hâkim olan: belirli program ve önbelleğe bağlı olarak, belirli işlevleri satır içine almak performansı artırabilir veya azaltabilir.[1]

Satır içi oluşturmanın etkisi, farklı soyutlama dereceleri nedeniyle programlama dili ve programa göre değişir. C ve Fortran gibi daha düşük seviyeli zorunlu dillerde, kod boyutu üzerinde küçük bir etki ile tipik olarak% 10-20 hız artışı sağlarken, daha soyut dillerde kaldırılan satır içi katman sayısı nedeniyle çok daha önemli olabilir. aşırı bir örnekle Kendisi, burada bir derleyici satır içi olarak 4 ile 55 arasında iyileştirme faktörleri gördü.[2]

Bir işlev çağrısını ortadan kaldırmanın doğrudan faydaları şunlardır:

  • Bir için gerekli talimatları ortadan kaldırır. işlev çağrısı, hem çağıran işlevde hem de aranan uçta: yığına veya yazmaçlara argümanlar yerleştirmek, işlev kendisini çağırır, işlev prologu, sonra dönüşte fonksiyon epilogu, dönüş ifadesi ve sonra dönüş değerini geri almak ve yığınlardan bağımsız değişkenleri kaldırmak ve kayıtları geri yüklemek (gerekirse).
  • Argümanları iletmek için kayıtlara ihtiyaç duyulmadığından, kayıt dökümü.
  • Referansları geçme zorunluluğunu ortadan kaldırır ve daha sonra kullanırken bunlardan vazgeçirir. referansla arama (veya adresle arama veya paylaşarak aramak ).

Satır içi yapmanın birincil yararı, izin verdiği diğer optimizasyonlardır. İşlev sınırlarını aşan optimizasyonlar gerek kalmadan yapılabilir prosedürler arası optimizasyon (IPO): satır içi bir kez gerçekleştirildikten sonra, ek içiprosedürel optimizasyonlar ("global optimizasyonlar") genişletilmiş fonksiyon gövdesinde mümkün hale gelir. Örneğin:

  • Bir sabit bir bağımsız değişken olarak iletilen, genellikle eşleşen parametrenin tüm örneklerine yayılabilir veya işlevin bir kısmı bir döngüden "kaldırılabilir" (aracılığıyla döngü ile değişmeyen kod hareketi ).
  • Kayıt tahsisi daha büyük işlev gövdesi boyunca yapılabilir.
  • Gibi üst düzey optimizasyonlar kaçış analizi ve kuyruk çoğaltma, daha geniş bir kapsamda gerçekleştirilebilir ve daha etkili olabilir, özellikle de bu optimizasyonları uygulayan derleyici esas olarak prosedür içi analize dayanıyorsa.[4]

Bunlar satır içi olmadan yapılabilir, ancak önemli ölçüde daha karmaşık bir derleyici ve bağlayıcı gerektirir (arayan ve aranan uçların ayrı derleme birimlerinde olması durumunda).

Tersine, bazı durumlarda, bir dil spesifikasyonu, bir programın, prosedür satır içine alındıktan sonra artık yapamayacağı prosedürlere ilişkin argümanlar hakkında ek varsayımlar yapmasına izin vererek bazı optimizasyonları engelleyebilir. Daha akıllı derleyiciler (ör. Glasgow Haskell Derleyici ) bunu izler, ancak saf satır içi bu bilgiyi kaybeder.

Bellek sistemi için satır içi yapmanın bir başka yararı da:

  • Dalları ortadan kaldırmak ve birbirine yakın yürütülen kodu bellekte tutmak, geliştirerek talimat önbelleği performansını iyileştirir. referans yeri (mekansal konum ve talimatların sıralılığı). Bu, özellikle sıralılığı hedefleyen optimizasyonlardan daha küçüktür, ancak önemlidir.[5]

Satır içi yazmanın doğrudan maliyeti, her arama sitesinde işlev gövdesinin çoğaltılması nedeniyle artan kod boyutudur. Bununla birlikte, bunu her zaman yapmaz, yani işlev gövdesinin bir işlev çağrısının boyutundan daha küçük olduğu çok kısa işlevler söz konusu olduğunda (arayıcıda, argüman ve dönüş değeri işleme dahil) önemsiz gibi erişimci yöntemleri veya mutatör yöntemler (alıcılar ve ayarlayıcılar); veya yalnızca tek bir yerde kullanılan bir işlev için, bu durumda yinelenmez. Bu nedenle, kod boyutu için optimizasyon yapılırsa satır içi en aza indirilebilir veya ortadan kaldırılabilir. gömülü sistemler.

Satır içi aynı zamanda, kod genişlemesinin (çoğaltmadan dolayı) talimat önbellek performansına zarar vermesi nedeniyle performansa bir maliyet getirir.[6] Bu, genişlemeden önce, çalışma seti programın (veya kodun sıcak bir bölümü) bellek hiyerarşisinin bir düzeyine (ör., L1 önbelleği ), ancak genişletme işleminden sonra artık uymuyor, bu da bu düzeyde sık sık önbellek kaçırmalarına neden oluyor. Hiyerarşinin farklı seviyelerindeki önemli performans farkı nedeniyle bu, performansı önemli ölçüde düşürür. En yüksek düzeyde bu, sayfa hataları nedeniyle felaket performans düşüşü ezici veya program hiç çalışmıyor. Bu sonuncusu, kod boyutunun kullanılabilir belleğe göre küçük olduğu, ancak gömülü sistemler gibi kaynak kısıtlı ortamlar için bir sorun olabileceği yaygın masaüstü ve sunucu uygulamalarında nadirdir. Bu sorunu hafifletmenin bir yolu, işlevleri daha küçük bir sıcak satır içi yola bölmektir (hızlı yol ) ve daha büyük bir soğuk satır içi olmayan yol (yavaş yol).[6]

Hatalı performansın sıralanması, öncelikle birçok yerde kullanılan büyük işlevler için bir sorundur, ancak ötesinde satır içi yapmanın performansı düşürdüğü başabaş noktasını belirlemek zordur ve genel olarak hassas yüke bağlıdır, bu nedenle manuel optimizasyona tabi olabilir veya profil yönlendirmeli optimizasyon.[7] Bu, diğer kod genişletme optimizasyonlarına benzer bir sorundur. döngü açma, aynı zamanda işlenen talimatların sayısını da azaltır, ancak daha düşük önbellek performansı nedeniyle performansı düşürebilir.

Satır içi yapmanın önbellek performansı üzerindeki kesin etkisi karmaşıktır. Küçük önbellek boyutları için (genişletmeden önceki çalışma kümesinden çok daha küçük), artan sıralılık baskındır ve satır içi önbellek performansını artırır. Satır içi yazmanın çalışma kümesini artık önbelleğe sığmayacak şekilde genişlettiği çalışma kümesine yakın önbellek boyutları için, bu baskın hale gelir ve önbellek performansı düşer. Çalışma kümesinden daha büyük önbellek boyutları için satır içi oluşturma, önbellek performansı üzerinde ihmal edilebilir bir etkiye sahiptir. Ayrıca, önbellek tasarımındaki değişiklikler, örneğin yük iletme, önbellek kaçırmalarındaki artışı telafi edebilir.[8]

Derleyici desteği

Derleyiciler, hangi işlev çağrılarının satır içine alınması gerektiğine karar vermek için çeşitli mekanizmalar kullanır; bunlar, belirli işlevler için programcılardan manuel ipuçlarını ve aracılığıyla genel kontrol içerebilir. komut satırı seçenekleri. Satır içi çevirme, birçok dilde, satır içi yapmanın yararlı olup olmadığına bağlı olarak birçok derleyici tarafından otomatik olarak yapılır, diğer durumlarda ise derleyici aracılığıyla manuel olarak belirtilebilir. direktifler, genellikle bir anahtar kelime kullanarak veya derleyici yönergesi aranan Çizgide. Tipik olarak bu, ipucunun gücü dile ve derleyiciye göre değişiklik göstererek satır içi yapmak yerine satır içi yazmanın istendiğini gösterir.

Tipik olarak, derleyici geliştiricileri yukarıdaki performans sorunlarını göz önünde bulundurur ve Sezgisel çoğu durumda performansı kötüleştirmek yerine iyileştirmek için hangi işlevlerin satır içi olarak seçileceğini derleyicilerine aktarır.

Uygulama

Bir kere derleyici belirli bir işlevi satır içi yapmaya karar vermişse, satır içi işlemi gerçekleştirmek genellikle basittir. Derleyicinin satır içi olarak farklı dillerdeki kodlar arasında çalışıp çalışmadığına bağlı olarak, derleyici üst düzey bir ara temsil (sevmek soyut sözdizimi ağaçları ) veya düşük düzeyli bir orta düzey temsil. Her iki durumda da, derleyici basitçe argümanlar, bunları işlevin bağımsız değişkenlerine karşılık gelen değişkenlerde saklar ve ardından işlevin gövdesini çağrı sitesine ekler.

Bağlayıcılar satır içi işlevi de yapabilir. Bir bağlayıcı işlevleri satır içi yaptığında, kütüphane işlevleri gibi kaynağı olmayan işlevleri satır içi yapabilir (bkz. bağlantı zamanı optimizasyonu ). Bir çalışma zamanı sistemi satır içi işlevi de olabilir. Çalışma süresi satır içi, hangi işlevlerin satır içi yapılacağına ilişkin daha iyi kararlar vermek için dinamik profil oluşturma bilgilerini kullanabilir. Java Hotspot derleyicisi.[9]

Burada, kaynak düzeyinde "elle" gerçekleştirilen satır içi genişletmenin basit bir örneği. C programlama dili:

int önceden(int x){    Eğer (x == 0)        dönüş 0;    Başka        dönüş x - 1;}

Satır içi yapmadan önce:

int işlev(int y) {    dönüş önceden(y) + önceden(0) + önceden(y+1);}

Satır içi yaptıktan sonra:

int işlev(int y) {    int tmp;    Eğer (y   == 0) tmp  = 0; Başka tmp  = y - 1;       /* (1) */    Eğer (0   == 0) tmp += 0; Başka tmp += 0 - 1;       /* (2) */    Eğer (y+1 == 0) tmp += 0; Başka tmp += (y + 1) - 1; /* (3) */    dönüş tmp;}

Bunun yalnızca bir örnek olduğunu unutmayın. Gerçek bir C uygulamasında, bir satır içi dil özelliği kullanmak tercih edilebilir. parametreli makrolar veya satır içi işlevler derleyiciye kodu bu şekilde dönüştürmesini söylemek için. Sonraki bölümde bu kodu optimize etmenin yolları listelenmektedir.

Montaj makro genişletmesi ile satır içi

Assembler makroları satır içi yapmaya alternatif bir yaklaşım sağlar, böylece bir talimat dizisi normal olarak tek bir makro kaynak ifadesinden (sıfır veya daha fazla parametre ile) makro genişletme yoluyla satır içi olarak üretilebilir. Parametrelerden biri, alternatif olarak tek seferlik ayrı ayrı oluşturmak için bir seçenek olabilir. altyordam diziyi içerir ve bunun yerine işleve satır içi bir çağrı ile işlenir.

TAŞIYOR = dizi1, TO = dizi2, INLINE = HAYIR

Sezgisel

Satır içi oluşturma için bir dizi farklı sezgisel tarama araştırılmıştır. Genellikle, bir satır içi algoritmanın belirli bir kod bütçesi vardır (program boyutunda izin verilen bir artış) ve bu bütçeyi aşmadan en değerli çağrı sitelerini satır içi yapmayı hedefler. Bu anlamda, birçok satır içi algoritma genellikle Sırt çantası sorunu.[10] Hangi çağrı sitelerinin daha değerli olduğuna karar vermek için, bir satır içi algoritması bunların faydasını tahmin etmelidir - yani. yürütme süresinde beklenen azalma. Satır içi uzmanlar, faydaları tahmin etmek için genellikle farklı kod yollarının çalıştırılma sıklığı hakkında profil bilgilerini kullanır.[11]

Profil oluşturma bilgilerine ek olarak, daha yeni tam zamanında derleyiciler aşağıdakiler gibi birkaç daha gelişmiş sezgisel tarama uygulayın:[4]

  • Hangi kod yollarının yürütme süresinde en iyi azalmaya yol açacağını tahmin etmek (satır içi yapmanın bir sonucu olarak ek derleyici optimizasyonlarını etkinleştirerek) ve bu tür yolların algılanan faydasını artırmak.
  • Satır içi için maliyet başına fayda eşiğini, derleme biriminin boyutuna ve halihazırda yerleştirilmiş olan kod miktarına göre uyarlayıcı bir şekilde ayarlama.
  • Alt yordamları kümeler halinde gruplamak ve tekil alt yordamlar yerine tüm kümeleri satır içine almak. Burada, buluşsal yöntem, kümelerin yalnızca uygun bir alt kümesini satır içine almanın hiçbir şeyi satır içine almamaktan daha kötü bir performansa yol açtığı yöntemleri gruplayarak tahmin eder.

Faydaları

Satır içi genişletmenin kendisi bir optimizasyondur, çünkü aramalardan kaynaklanan ek yükü ortadan kaldırır, ancak bir dönüşümü sağlamak. Yani, derleyici çağrı sitesi bağlamında bir işlev gövdesini genişlettiğinde - genellikle düzeltilebilecek argümanlarla sabitler - daha önce mümkün olmayan çeşitli dönüşümler yapabilir. Örneğin, bir şartlı şube bu belirli arama sitesinde her zaman doğru veya her zaman yanlış olabilir. Bu da etkinleştirebilir ölü kod eleme, döngü ile değişmeyen kod hareketi veya indüksiyon değişken eliminasyonu.

Önceki bölümdeki C örneğinde, optimizasyon fırsatları çoktur. Derleyici şu adımları izleyebilir:

  • tmp + = 0 (2) ve (3) işaretli satırlardaki ifadeler hiçbir şey yapmaz. Derleyici bunları kaldırabilir.
  • Kondisyon 0 == 0 her zaman doğrudur, bu nedenle derleyici (2) işaretli satırı sonuç ile değiştirebilir, tmp + = 0 (hiçbir şey yapmaz).
  • Derleyici koşulu yeniden yazabilir y + 1 == 0 -e y == -1.
  • Derleyici ifadeyi azaltabilir (y + 1) - 1 -e y.
  • İfadeler y ve y + 1 her ikisi de sıfıra eşit olamaz. Bu, derleyicinin bir testi ortadan kaldırmasını sağlar.
  • Gibi ifadelerde eğer (y == 0) y döndürür değeri y vücutta bilinir ve satır içi olabilir.

Yeni işlev şuna benzer:

int işlev(int y) {    Eğer (y == 0)        dönüş 0;    Eğer (y == -1)        dönüş -2;    dönüş 2*y - 1;}

Sınırlamalar

Tam satır içi genişletme her zaman mümkün değildir, çünkü özyineleme: özyinelemeli olarak satır içi genişletme çağrıları sonlandırmaz. Sınırlı bir miktarı genişletmek veya arama grafiği ve belirli düğümlerde döngüleri kırmak (yani özyinelemeli bir döngüde bazı kenarları genişletmemek).[12] Özyinelemeli genişletme sona ermediğinden ve genellikle özyinelemeli makroların yasaklanmasıyla (C ve C ++ 'da olduğu gibi) çözüldüğünden, makro genişletmede de aynı sorun ortaya çıkar.

Makrolarla karşılaştırma

Geleneksel olarak aşağıdaki gibi dillerde C, satır içi genişletme kullanılarak kaynak düzeyinde gerçekleştirildi parametreli makrolar. Gerçek satır içi işlevlerin kullanımında olduğu gibi C99, bu yaklaşıma göre birkaç avantaj sağlar:

  • C'de, makro çağrıları gerçekleştirilmez tür denetimi, hatta argümanların iyi biçimlendirildiğini kontrol edin, oysa işlev çağrıları genellikle yapar.
  • C'de, bir makro bir işlevin yapacağı aynı anlama sahip return anahtar sözcüğünü kullanamaz (bu, makro yerine genişletmeyi sonlandırmasını isteyen işlevi yapar). Başka bir deyişle, bir makro, içinde çağrılan son ifadenin sonucu olmayan hiçbir şeyi döndüremez.
  • C makroları yalnızca metin ikamesi kullandığından, bu, argümanların yeniden değerlendirilmesi nedeniyle istenmeyen yan etkilere ve verimsizliğe neden olabilir. operasyonların sırası.
  • Makrolardaki derleyici hatalarının anlaşılması genellikle zordur çünkü bunlar programcının yazdığı kod yerine genişletilmiş koda atıfta bulunur. Bu nedenle, satır içi kod için hata ayıklama bilgileri genellikle makro genişletilmiş koddan daha yararlıdır.
  • Birçok yapının makrolar kullanılarak ifade edilmesi garip veya imkansızdır veya önemli ölçüde farklı bir sözdizimi kullanır. Satır içi işlevler, sıradan işlevlerle aynı sözdizimini kullanır ve kolaylıkla isteğe bağlı olarak satır içi ve satır içi olmayabilir.

Birçok derleyici, bazılarını satır içi olarak genişletebilir. özyinelemeli işlevler;[13] yinelemeli makrolar genellikle yasa dışıdır.

Bjarne Stroustrup, C ++ tasarımcısı, makrolardan mümkün olduğu kadar kaçınılması gerektiğini vurgulamayı sever ve satır içi işlevlerin kapsamlı kullanımını savunur.

Seçim yöntemleri

Pek çok derleyici, yararlı olduğu her yerde işlevleri agresif bir şekilde satır içi yapar. Daha büyük olmasına rağmen çalıştırılabilir dosyalar Bununla birlikte, bellek kapasitesi CPU hızından daha hızlı arttığı için agresif satır içi uygulama yine de daha cazip hale geldi. Satır içi, aşağıdaki kritik bir optimizasyondur: işlevsel diller ve nesne yönelimli programlama dilleri, klasik optimizasyonları etkili kılmak için tipik olarak küçük işlevleri için yeterli bağlam sağlamasına güvenen.

Dil desteği

Dahil birçok dil Java ve işlevsel diller, satır içi işlevler için dil yapıları sağlamaz, ancak bunların derleyicileri veya yorumlayıcıları genellikle agresif satır içi genişletme gerçekleştirir.[4] Diğer diller, genellikle derleyici olarak açık ipuçları için yapılar sağlar direktifler (pragmalar).

İçinde Ada programlama dili satır içi işlevler için bir pragma vardır.

İçindeki fonksiyonlar Ortak Lisp satır içi olarak tanımlanabilir Çizgide böyle bir beyan:[14]

 (beyan etmek (Çizgide sevk etmek)) (defun sevk etmek (x)   (funcall     (almak (araba x) 'sevk etmek) x))

Haskell derleyici GHC Yeterince küçük olan işlevleri veya değerleri satır içi yapmaya çalışır, ancak satır içi bir dil pragması kullanılarak açıkça not edilebilir:[15]

key_function :: Int -> Dize -> (Bool, Çift){- # INLINE key_function # -}

C ve C ++

C ve C ++ bir şeye sahip Çizgide hem bir derleyici yönergesi olarak işlev gören anahtar sözcük — satır satırının İstenen Ama değil gereklidir—Ve ayrıca görünürlük ve bağlantı davranışını değiştirir. Görünürlük değişikliği, işlevin standart C araç zinciri aracılığıyla satır içine alınmasına izin vermek için gereklidir; burada tek tek dosyaların derlenmesi (bunun yerine, çeviri birimleri ) ardından bağlantı gelir: bağlayıcının satır içi işlevleri yapabilmesi için, bunlar başlıkta belirtilmeli (görünür olmalı) ve işaretlenmelidir Çizgide (çoklu tanımlardan kaynaklanan belirsizliği önlemek için).

Ayrıca bakınız

Notlar

  1. ^ Alan kullanımı "talimat sayısıdır" ve hem çalışma zamanı alanı kullanımı hem de ikili dosya boyut.
  2. ^ Kod boyutu aslında çağrı ek yükünün işlevin gövdesinden daha büyük olduğu çok kısa işlevler için veya çoğaltmanın olmadığı tek kullanımlık işlevler için küçülür.

Referanslar

  1. ^ a b Chen vd. 1993.
  2. ^ Chen vd. 1993, 3.4 İşlev satır içi genişletme, s. 14.
  3. ^ a b c [1] Prokopec ve diğerleri, Tam Zamanında Derleyiciler için Optimizasyona Dayalı Artımlı Satır İçi Değiştirme Algoritması, JVM için Graal derleyicisinde kullanılan satır içi yerleştirici hakkında CGO'19 yayını
  4. ^ Chen vd. 1993, 3.4 İşlev satır içi genişletme, s. 19–20.
  5. ^ a b Benjamin Poulain (8 Ağustos 2013). "Olağandışı hız artışı: boyut önemlidir".
  6. ^ Örneğin bkz. Uyarlanabilir Optimizasyon Sistemi Arşivlendi 2011-08-09'da Wayback Makinesi içinde Jikes RVM Java için.
  7. ^ Chen vd. 1993, 3.4 İşlev satır içi genişletme, s. 24–26.
  8. ^ [2] Java için Graal JIT derleyicisinde kullanılan inliner'ın açıklaması
  9. ^ [3] Scheifler, Yapılandırılmış Bir Programlama Dili için Satır İçi Değiştirme Analizi
  10. ^ [4] Matthew Arnold, Stephen Fink, Vivek Sarkar ve Peter F. Sweeney, A Comparative Study of Static and Profile-based Heuristics for Inlining
  11. ^ Jones ve Marlow 1999, 4. Sonlandırmayı Sağlama, s. 6–9.
  12. ^ Özyinelemeli Alt Yordamlar için Satır İçi Anlambilim " tarafından Henry G. Baker
  13. ^ Beyanname ÇİZGİDE, NOTINLINE -de Ortak Lisp HyperSpec
  14. ^ 7.13.5.1. INLINE pragma Bölüm 7. GHC Dil Özellikleri

Dış bağlantılar