Inlining
- Go kursu
- Uzman
- Ders 16/34
- 4 dk
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
package main
import (
"fmt"
"testing"
)
func main() {
// buraya yaz
}Örnek çözüm
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
go build -gcflags=____ .
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 |