CodeBlanks Logo Icon CodeBlanks

Bellek benchmark'ı

b.ReportAllocs ile bellek kullanımını ölçmeyi öğrenirsin.

Bellek benchmark'ı

b.ReportAllocs() ya da -benchmem bayrağı, işlem başına ayrılan bayt (B/op) ve ayırma sayısını (allocs/op) gösterir. Ayırma sayısı çoğu zaman süreden daha kararlı bir ölçüdür ve GC baskısının doğrudan göstergesidir.

func BenchmarkBuilder(b *testing.B) {
    b.ReportAllocs()
    for i := 0; i < b.N; i++ {
        var sb strings.Builder
        sb.Grow(64)
        sb.WriteString("merhaba")
        sink = sb.String()
    }
}

Ayırma testi

Sıcak bir yolun ayırma yapmadığını bir testle kilitleyebilirsin; biri yanlışlıkla ayırma eklerse test kırılır:

func TestAnahtarAyirmasiz(t *testing.T) {
    n := testing.AllocsPerRun(100, func() { sink = anahtar(42) })
    if n != 0 {
        t.Fatalf("anahtar %v ayırma yaptı, 0 bekleniyordu", n)
    }
}

Uygulama Ayırmasız anahtar

anahtar(n int) int fonksiyonu n*31 + 7 döndürsün. testing.AllocsPerRun(100, ...) ile ayırma sayısını ölç ve 0 olduğunu 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 anahtar(n int) int { return n*31 + 7 }

func main() {
    n := testing.AllocsPerRun(100, func() { sink = anahtar(42) })
    fmt.Println(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 ayırma sayısını hızlıca öğrenmek için benchmark dışında hangisi kullanılır?

  • go vet
  • testing.AllocsPerRun Doğru cevap
  • runtime.NumGoroutine
  • time.Since

Açıklama: AllocsPerRun fonksiyonu birkaç kez çalıştırıp ortalama ayırma sayısını verir; testlerde "sıfır ayırma" garantisi için kullanılır.

2 Ayırmaları göster

Soru
func BenchmarkX(b *testing.B) {
    b.____()
    for i := 0; i < b.N; i++ { sink = x() }
}
Cevap
func BenchmarkX(b *testing.B) {
    b.ReportAllocs()
    for i := 0; i < b.N; i++ { sink = x() }
}

Açıklama: ReportAllocs, -benchmem verilmese de bu benchmark için B/op ve allocs/op yazdırır.

3 Ölçüm aracı

Kavram Anlamı
-benchmem Tüm benchmark'larda bellek
b.ReportAllocs() Tek benchmark'ta bellek
testing.AllocsPerRun Test içinde ayırma sayısı
allocs/op GC baskısı göstergesi

Orta seviye bölümündeki tüm dersler