CodeBlanks Logo Icon CodeBlanks

Inlining

Derleyicinin fonksiyonları satır içine nasıl aldığını öğrenirsin.

Inlining

Inlining, küçük bir fonksiyonun çağrısını gövdesiyle değiştirmektir; çağrı maliyeti ortadan kalkar ve çağıran koda daha fazla optimizasyon açılır. Go derleyicisi her fonksiyona bir maliyet verir; bütçe (80 düğüm) altındakiler inline edilir.

func kare(x int) int { return x * x }

y := kare(5)  // derlenince: y := 5 * 5 → 25

-gcflags=-m çıktısında can inline kare ve inlining call to kare satırları görünür.

Orta yığın inlining ve PGO

Go 1.12'den beri başka fonksiyon çağıran fonksiyonlar da (mid-stack) inline edilebilir. Döngü, defer, recover veya büyük switch içeren fonksiyonlar maliyeti aşabilir. PGO profilinde "sıcak" görünen çağrılar için bütçe büyütülür; böylece en çok çalışan yollar daha agresif optimize edilir.

Uygulama noinline etkisi

topla(a, b int) int ve //go:noinline işaretli toplaNI(a, b int) int yaz. İkisini testing.Benchmark ile ölç ve iki sonucun da 0'dan fazla tekrar (N > 0) yaptığını yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "testing"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "testing"
)

var sink int

func topla(a, b int) int { return a + b }

//go:noinline
func toplaNI(a, b int) int { return a + b }

func main() {
    r1 := testing.Benchmark(func(b *testing.B) {
        for i := 0; i < b.N; i++ {
            sink = topla(i, 1)
        }
    })
    r2 := testing.Benchmark(func(b *testing.B) {
        for i := 0; i < b.N; i++ {
            sink = toplaNI(i, 1)
        }
    })
    fmt.Println(r1.N > 0 && r2.N > 0)
}

Beklenen çıktı

true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir fonksiyonun inline edilmesini engelleyen yönerge hangisidir?

  • //go:noinline Doğru cevap
  • //go:inline
  • //go:nosplit
  • //go:embed

Açıklama: //go:noinline genellikle benchmark ve testlerde gerçek çağrı maliyetini ölçmek için kullanılır; Go'da //go:inline diye bir yönerge yoktur.

2 Inlining'i kapat

Soru
go build -gcflags=____ .
Cevap
go build -gcflags=-l .

Açıklama: -gcflags=-l tüm inlining'i kapatır; hata ayıklamada ve karşılaştırmada kullanılır.

3 Bayrak ve anlamı

Kavram Anlamı
-gcflags=-m Kararları göster
-gcflags=-l Inlining kapalı
-gcflags=-N Optimizasyon kapalı
//go:noinline Tek fonksiyonu engelle

Uzman bölümündeki tüm dersler