Bellek benchmark'ı
- Go kursu
- Orta seviye
- Ders 49/80
- 4 dk
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
package main
import (
"fmt"
"testing"
)
func main() {
// buraya yaz
}Örnek çözüm
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
func BenchmarkX(b *testing.B) {
b.____()
for i := 0; i < b.N; i++ { sink = x() }
}
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 |